首页 > nodejs中如何并行两个异步,等它们都完成后继续下面的操作?

nodejs中如何并行两个异步,等它们都完成后继续下面的操作?

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的情况。
文档看这里。

【热门文章】
【热门文章】