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

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

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

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

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

我目前是使用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级讲师

membalas semua(4)
小葫芦

一个优雅的方法:

把所有异步操作都用 Promise 封装。然后你就可以 Promise.all(逃

Peter_Zhu

用es6写同步形式的代码

洪涛

弄个setInterval循环判断某个你最终加载的dom有没有生成或者dom的高度是不是达到预期吧,靠浏览器端来判断,你node只是服务端或中间件提供不了这个功能

黄舟

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan