0

複数の jade ファイルを読み取ってコンパイルし、これらのファイルを使用する必要があります。以下のコードで bluebird promises ライブラリを使用しています。

var indexJadeFile = 'template/index.jade';
var otherJadeFile = 'template/other.jade';

function readAndCompileJade(jadeFile){
    fs.readFileAsync(jadeFile, 'utf8').then(function(content){
        console.log('reading jade file: ' , jadeFile);
        return jade.compile(content, {
            pretty   : true,
            filename : jadeFile,
            basedir  : templateBaseDir
        });
    })
}

promise.all([
    readAndCompileJade(indexJadeFile),
    readAndCompileJade(postJadeFile),
    readAndCompileJade(sitemapJadeFile),
    readAndCompileJade(archivesJadeFile)])
    .then(function(results){
    console.log('results block');
        compiledIndex    = results[0];
        compiledPost     = results[1];
        compiledSitemap  = results[2];
        compiledArchives = results[3];
    });

すべての jade ファイルが実行された後に then ブロックが実行されると仮定しました。しかし、実行すると、ステートメントのresults block前に出力されていることがわかります。reading jade file

すべての promise が完了するのを待ってから、残りのブロックを実行するにはどうすればよいですか?

4

1 に答える 1

3

これは、あなたreadAndCompileJadeが同期的であり、約束を返さないためです。

約束を返さなければなりません。いつ継続
すべきかをどのように知る必要がありますか?promise.all

あなたの場合、それfs.readFileAsyncはあなたが使用する約束に基づいていると思います.thenので、それを返すことができます:

function readAndCompileJade(jadeFile){
   return fs.readFileAsync(jadeFile, 'utf8').then(function(content){
    console.log('reading jade file: ' , jadeFile);
    return jade.compile(content, {
      pretty   : true,
      filename : jadeFile,
      basedir  : templateBaseDir
    });
  })
}
于 2014-07-18T12:28:06.503 に答える