停止并行执行



我有四个并行运行的函数。如果任何一个函数在两者之间失败,我该如何停止其他函数的执行。这方面的任何帮助都将非常有帮助。

除非是 setTimeout 或 setInterval,我认为你不能。无论如何,您可以在函数的逻辑中设置检查点。它不是全部干净,但它可以工作。例如,检查回调中的其他函数:

var control = true;
async1(function(e,r){
  if(e) {
    control = false;
    return callback1(e,r);
  };
  if(control) callback1(e,r);
});
async2(function(e,r){
  if(e) {
    control = false;
    return callback2(e,r);
  };
  if(control) callback2(e,r);
});

Althougt 要做到这一点,我会使用 throrin19 并说异步这是一个很好的库。

但也许你想检查一下公司。它可以比异步更好地处理您的问题。

您无法停止执行函数。函数是同步执行和返回的,因此从技术上讲没有什么可以停止的。但是可以有异步任务,它们以某种方式使用底层 libuv 功能(也就是说,如果不调用一些异步节点 api 或一些本机模块,你就不能做任何异步的事情)。函数只是此类任务的接口,它们不支持取消任务,仅支持启动。

因此,您不能真正取消异步操作,但是如果一个操作失败,您可以做的是忽略其他操作的结果。以下是它的实现方式:

var tasks = [], //array of tasks, functions accepting callback(err) 
    pending = tasks.length, //amount of pending tasks
    failed = false;
function done(err) { //callback for each task
    if (failed) return;
    if (err) {
         failed = true;
         callback(err); //callback for all tasks
    }  
    if (!--pending) callback(); //all tasks completed
}
tasks.forEach(function(task) {
    task(done);
});

我认为你应该使用异步库。异步包含并行函数,可以并行执行函数(当然)。每个函数都接受一个回调(错误、结果)。如果发生错误,异步将切断所有其他进程。

文档

最新更新