• 1.3k

nodejs 有没有办法判断所有的异步都执行结束了?

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

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

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

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

我目前是使用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.任务永远无法结束。

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

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

阅读 4.8k
评论
    4 个回答
    • 4.3k

    一个优雅的方法:

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

      • 1
      • 新人请关照

      用es6写同步形式的代码

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

          撰写回答

          登录后参与交流、获取后续更新提醒

          相似问题
          推荐文章