node.js - nodejs 有没有办法判断所有的异步都执行结束了?
PHP中文网
PHP中文网 2017-04-17 14:35:52
0
4
581

因为程序太多的异步请求了。有时候超时什么的,虽然目前还能判断出来何时结束,但是有时候总有各种微小的概率判断不准确。也就是单靠计数无法准确的统计所有的异步都执行结束了。特别是程序业务非常复杂的时候。

如果判断不准确,我根本无法反馈给用户,程序已经执行完毕。然后用户一直干等。

所以,如果能直接判断页面所有的异步都已经结束那就很好了。有这个东西吗?

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

我目前是使用async/waterfall实现的,代码如下

function test(i){
    
    
    waterfall([

        //步骤1
        function(callback) {
                
            thread(function (){
                //callback(null, 'a');
            }, 800);
            
        },
        
        //步骤2
        function(a, callback){
            
            dlog('执行到步骤2'+a);
            
        }
        
    
    ], function (err, a, b) {
        dlog('任务结束'+a+b);
         dlog(err);
    });

}

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

如上,正常情况下的流程: 步骤1--步骤2--任务结束

任务结束,计数+1,比如任务总数=10时,计数=10即可判断任务全部结束。

现在问题来了。假如步骤1的那个异步,发生了异常,没有回调。无法进行到下一步,自然也执行不到结束那个位置。
流程就这样中断了。

所以计数永远小于10.任务永远无法结束。

至于为什么发生没有回调的情况。读取网页,下载图片等一系列的操作,之前没有设置超时时间,读取的异步好像永远都不回调,现在设置超时时间才没有这个问题。

因为使用的是第三方的模块,这类问题依然会有概率发生,至于为什么,估计得研究人家的源码才能找到答案了。

PHP中文网
PHP中文网

认证0级讲师

reply all(4)
小葫芦

An elegant approach:

Encapsulate all asynchronous operations with Promise. Then you can Promise.all(escape

Peter_Zhu

Use es6 to write synchronous code

洪涛

Use a setInterval loop to determine whether the DOM you finally loaded has been generated or whether the height of the DOM has reached the expected level. You can rely on the browser to judge. Your node is only a server or middleware and cannot provide this function

黄舟

试试 async
http://caolan.github.io/async/

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template