搜尋

首頁  >  問答  >  主體

node.js - 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.任务永远无法结束。

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

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

PHP中文网PHP中文网2778 天前575

全部回覆(4)我來回復

  • 高洛峰

    高洛峰2017-04-17 14:37:52

    一個優雅的方法:

    把所有非同步操作都用 Promise 封裝。然後你就可以 Promise.all(逃

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 14:37:52

    用es6寫同步形式的程式碼

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 14:37:52

    弄個setInterval循環判斷某個你最終加載的dom有沒有生成或者dom的高度是不是達到預期吧,靠瀏覽器端來判斷,你node只是服務端或中間件提供不了這個功能

    回覆
    0
  • 黄舟

    黄舟2017-04-17 14:37:52

    嘗試非同步
    http://caolan.github.io/async/

    回覆
    0
  • 取消回覆