我必须用async处理一个数组

var arr = [1,2,3,4];
Async.map(arr, iterator, callback);


我无法控制的iterator函数会为所有值抛出错误,但是说4

function iterator(val, cb) {
    console.debug('processing', val);
    if (val == 4) cb();
    else cb(new Error(val));
}


异步会做的是


  如果iterator将错误传递给他的回调,则立即调用主callback(用于map函数)并显示错误。


所以我得到

processing 1
[Error: 1]
processing 2
processing 3
processing 4


我想要的是它不应立即因错误而调用callback,而是要等到它处理整个列表(无论如何都会这样做),然后才调用callback

这可能吗?还是有Async.map的替代品以这种方式运行?

最佳答案

如果迭代器将错误传递给他的回调,则主回调(用于map函数)将立即错误调用


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

您可以改为将null值传递回回调,而不会出错。

function iterator(cb, trans) {
  try {
    // something
    cb(null, transformed);
  }
  catch (ex) {
    // log the error perhaps
    cb(null, null);
  }
}


由于您无法控制迭代器,因此可以在其周围编写包装器。

假设它们的迭代器称为their_iterator

function my_iterator(cb, trans) {
  var my_cb = function(their_err, their_trans) {
    if (their_err) {
      // log error
        cb(null, null);
    }
    else {
        cb(null, their_trans);
    }
  }

  their_iterator(my_cb, trans);
}

Async.map(arr, my_iterator, callback);

关于javascript - Async.map-使它忽略错误,并处理整个列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29598970/

10-12 00:13
查看更多