初学者。我开始意识到我使用异步函数的方式可能无法充分利用异步性质。
我这样做:
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();
});
回调中的函数在两次加载之后都没有被调用?
答案 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(); });