https://.com/q/1010000005943986?_ea=966070
上次我问过一个问题, 这个问题解答了一步一步通过promise异步后再完成的方法,但今天我突然又想到另一种情况,如果有好几个异步操作可以同时进行,但必须等它们全部完成后才能进行下面的操作,应该如何编码呢?设想下面的情况:
我们需要读几个文件,它们没有必然的先后关系,只要都读完就可以,但必须都读完才能进行下一步,请问该怎么做呢?
可以用 Promise.all。
具体用法可以参考:链接描述
用async
async.parallel({
swslist: function(callback){
var param = {
v_act: 'v_swslist',
v_ldata: 'btype:0',
v_lnum: 10,
v_lpage: 1,
v_mid: settings.Interface.mid
};
functions.dz_http_get(param, function(data){
callback && callback(null, data)
});
},
webIlist: function(callback){
var param = {
v_act: 'v_webIlist',
v_id: 5,
v_mid: settings.Interface.mid,
v_type: 2
};
functions.dz_http_get(param, function(data){
callback && callback(null, data)
});
}
}, function(err, results){
if(err || typeof results.swslist === 'string' || typeof results.webIlist === 'string'){
res.render('error.html', {
errormsg: msg.parameter_error
});
return;
}
res.render('business/index.html', {
busList: results.swslist,
articleList: results.webIlist,
label_css: 'dz_label_swbc',
label: msg.pagename.business
});
});
var fs = require('fs');
var completedTasks = 0;
var tasks = [];
var filesDir = './text';
function checkIfComplete(){
completedTasks++;
if(completedTasks == tasks.length){ //读取文件任务完成
}
}
fs.readdir(filesDir, function(err, files){
if(err) throw err;
for(var index in files ){
var task = (function(file){
return function(){
fs.readFile(file, function(err, text){
if(err) throw err;
checkIfComplete();
})
}
})(filesDir + '/'+ files[index]);
tasks.push(task);
}
for(var task in tasks ){
tasks[task]();
}
})
一个插件:async
then呀,链式执行。
var getFile = function(filename) {
return new Promise(function(resolve, reject){
//读取文件
resolve(filename + '中的文件内容');
});
}
Promise.all([getFile('文件1'),getFile('文件2'),getFile('文件3')])
.then(function(res){
//res:['文件1的内容','文件2的内容','文件3的内容']
})
用bluebird
的Promise。Promise.all
可以用来处理一组Promises,也可以用Promise.join
,可以用来处理几个Promises的情况。
文档看这里。