问题描述
初学者在这里。 我开始意识到,我使用异步函数的方式可能没有充分利用异步特性。
我做这样的事情:
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();
});
直到两者都加载后才调用回调函数?
1楼
根据我们的要求,我们可能需要等待一个操作完成才能开始另一操作。
但是在您的情况下,如果这两个操作互不相关,并且您想在两个操作都完成后执行一些操作,请检查模块。
使用它,您可以编写:
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");
});
2楼
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++;
});
3楼
用诺言。 就像是:
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(); });
参见