0

我必须阅读、编译多个玉文件,然后使用这些文件。我正在使用带有以下代码的蓝鸟承诺库:

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];
    });

我假设 then 块将在所有玉文件执行后执行。但是当我执行时,我发现在语句results block之前打印了。reading jade file

我如何等待所有承诺完成,然后执行其余的块?

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 回答