javascript - nodejs中如何并行两个异步,等它们都完成后继续下面的操作?
伊谢尔伦
伊谢尔伦 2017-04-11 11:41:03
[JavaScript讨论组]

https://segmentfault.com/q/1010000005943986?_ea=966070
上次我问过一个问题, 这个问题解答了一步一步通过promise异步后再完成的方法,但今天我突然又想到另一种情况,如果有好几个异步操作可以同时进行,但必须等它们全部完成后才能进行下面的操作,应该如何编码呢?设想下面的情况:
我们需要读几个文件,它们没有必然的先后关系,只要都读完就可以,但必须都读完才能进行下一步,请问该怎么做呢?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(7)
黄舟

可以用 Promise.all。
具体用法可以参考:链接描述

高洛峰
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的内容']
})
怪我咯

then呀,链式执行。

天蓬老师

一个插件:async

天蓬老师

用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
        });
    });
PHP中文网

bluebird的Promise。Promise.all可以用来处理一组Promises,也可以用Promise.join,可以用来处理几个Promises的情况。
文档看这里。

阿神
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]();
    }
})
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号