node.js - nodejs 异步执行顺序的疑问
迷茫
迷茫 2017-04-17 14:37:02
[Node.js讨论组]

我发现nodejs的异步是这样的。

请看图:

请看代码:

for(let i = 0; i < 5; i++){
    test(i);
}



function test(i){
    
    
    waterfall([

        //步骤1
        function(callback) {
                
            thread(function (){
                dlog('线程A'+i);
                callback(null, i);
            }, 800);
            
        },
        
        //步骤2
        function(a, callback){
            
            thread(function (){
                dlog('线程B'+i);
                callback(null, i);
            }, 800);
            
            
            
        }
        
    
    ], function (err, result) {
        dlog('任务结束'+result);
    });

}



function dlog(msg){
     console.log(msg);
}

function thread(callBack, time){
    
     setTimeout(function(){
        callBack();
      },  time)
    
}

也就是说,先执行完外层的任务,再执行内层的任务。

也就是顺序是:
A0,A1,A2,……
B0,B1,B2,……

现在我希望的顺序是:

A0,B0,A1,B1……

有什么办法吗?

办法可能就是执行完一个任务再执行下一个任务,不过这样速度可就慢了,体现不出异步执行的优点了

test(0);



function test(i){
    
    
    waterfall([

        //步骤1
        function(callback) {
                
            thread(function (){
                dlog('线程A'+i);
                callback(null, i);
            }, 800);
            
        },
        
        //步骤2
        function(a, callback){
            
            thread(function (){
                dlog('线程B'+i);
                callback(null, i);
            }, 800);
            
            
            
        }
        
    
    ], function (err, result) {
        dlog('任务结束'+result);
        if(i < 5) test(i+1);
        
    });

}

为啥我会有这么个需求。简单来说,假如你用程序读取1万个文件,只是打个比分。
你需要每次读取完成一个文件,告诉用户执行到26%这样的进度条给他。让他知道程序是在干活的。
如果按照平时的异步运行顺序。nodejs是循环读取了一万次之后,才开始读取第一个文件成功。那么循环一万次的这个过程中,进度条就是0%。毫无变化。让用户觉得,程序啥事也没干。

-------------补充-----------------

很久之后,我才知道,这个可以用并发数来控制,比如一次读10条,读完再换下一批。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
PHP中文网

node 是单线程异步

ringa_lee

你这个问题用es6的Generator正合适,异步操作中可以yield终止当前操作,并交出控制权,然后进行下一轮操作,
或者模拟一下koa和express中间件的思路。加一个next(),终止当前操作,进行下一个任务

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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