【问题标题】:node.js execute function after 'n' async callback are executednode.js 在执行'n'异步回调后执行函数
【发布时间】:2013-02-02 03:11:42
【问题描述】:

我不知道如何在 'n' 异步函数执行后执行回调,例如:

var after4AsyncOperation = function(){
    //do something...
}
process.nextTick(function(){
    //do stuff
})
process.nextTick(function(){
    //do stuff
})
process.nextTick(function(){
    //do stuff
})
process.nextTick(function(){
    //do stuff
})

有没有办法在 4 个异步函数之后执行 after4AsyncOperation 而不必在另一个函数中编写函数,例如:

    var after4AsyncOperation = function(){
    //do something...
}
process.nextTick(function(){
    //do stuff
    process.nextTick(function(){
        //do stuff
        process.nextTick(function(){
            //do stuff
            process.nextTick(function(){
                //do stuff
                after4Asyncoperation();
            })
        })
    })
})

【问题讨论】:

    标签: node.js events asynchronous callback


    【解决方案1】:

    您可以利用出色的 async 库,它具有此功能和许多其他不错的特性。要具体完成您想要做的事情,您可以使用系列:

    https://github.com/caolan/async#series

    或并行:

    https://github.com/caolan/async#parallel

    两者的区别在于series一个接一个地运行所有函数,而parallel同时运行所有函数。无论哪种情况,在它们都完成后都会有一个回调,这似乎是您想要完成的。

    【讨论】:

      【解决方案2】:

      我建议使用异步库,例如 Caolan's Async。然后,您可以使用async.parallelasync.seriesasync.autoauto 是最灵活的,但比其他的要慢一些;在 parallelseries 之间进行选择将需要更多关于您正在尝试做什么的信息 - 您的第一个示例将是并行操作,但您的第二个示例是串联操作。

      但是,如果您不想使用库,您可以编写一些自定义的东西。我会这样做:

      var numFuncs = 4;
      var callback = function(){
        numFuncs--;
        if(numFuncs == 0) {
          after4AsyncOperation();
        }
      }
      var after4AsyncOperation = function(){
          //do something...
      }
      process.nextTick(function(){
          //do stuff
          callback();
      })
      process.nextTick(function(){
          //do stuff
          callback();
      })
      process.nextTick(function(){
          //do stuff
          callback();
      })
      process.nextTick(function(){
          //do stuff
          callback();
      })
      

      这通过从我们期望回调被调用的次数 (numFuncs) 倒计时并且仅在我们被回调正确的次数时才调用 after4AsyncOperation 来实现。

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-26
        相关资源
        最近更新 更多