0

我有四个并行运行的函数。如果任何一个功能在两者之间失败,我该如何停止其他功能的执行。对此的任何帮助都会非常有帮助。

4

3 回答 3

2

除非它是 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);
});

不过要做到这一点,我会选择 throrin19 并说 Async 是一个很好的库来做到这一点。

但也许你想检查一下co。它可以比 Async 更好地处理您的问题。

于 2013-10-15T07:33:00.567 回答
1

您无法停止执行功能。函数是同步执行和返回的,所以技术上没有什么可以停止的。但是可能会有异步任务,它们以某种方式使用底层的 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);
});
于 2013-10-15T10:37:40.777 回答
0

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

文档

于 2013-10-15T06:56:50.680 回答