NodeJS:如何在多个异步函数完成后执行操作?

时间:2015-07-16 11:41:36

标签: javascript node.js

初学者。我开始意识到我使用异步函数的方式可能无法充分利用异步性质。

我这样做:

fs.readFile(file, function(err, data){
  fs.readAnotherFile(anotherFile, function(err, data){
      doThisAfterBothHaveLoaded();
    });
  })
})

但是如果我在开始另一件事之前等待一件事情完成,那是不是打败了这种异步的目的呢?

那我该怎么做呢?

fs.readfile(file, function(err, data){
  doThisAfterBothHaveLoaded();
});

fs.readAnotherFile(anotherFile, function(err, data){
  doThisAfterBothHaveLoaded();
});

回调中的函数在两次加载之后都没有被调用?

3 个答案:

答案 0 :(得分:3)

根据我们的要求,我们可能需要等待一个操作完成才能开始另一个操作。

但在您的情况下,如果两个操作彼此不相关,并且您想在两个操作完成后执行某些操作,请检查async模块。

使用它,你可以写:

async.each(['file1.txt', 'file2.txt'], function (filename, cb) {
    fs.readFile(filename, function (err, data) {
        if (err) {
            return cb(err);
        }
        console.log("Reading " + filename + " complete!");
        // do something with data
        console.log(data);
        cb(null);
    });
}, function (err) {
    console.log("Reading both files is complete");
});

答案 1 :(得分:1)

var i = 0;
fs.readfile(file, function(err, data){
if(i==1) doThisAfterBothHaveLoaded();
else i++
});

fs.readAnotherFile(anotherFile, function(err, data){
if(i==1) doThisAfterBothHaveLoaded(); 
else i++;
});

答案 2 :(得分:1)

使用承诺。类似的东西:

var Promise = require('promise');
var read = Promise.denodeify(fs.readFile);

var p1 = read(file);
var p2 = read(anotherFile);
Promise.all([p1, p2])
.then(function(res) { doThisAfterBothHaveLoaded(); });

请参阅https://www.npmjs.com/package/promise