什么库或模式可以减少这个cb到1 cb的样板?

时间:2016-05-23 19:50:51

标签: javascript arrays node.js

我发现自己在我的代码中写了很多这样的东西,而且我确信那里有一个标准的库可以让它变得更简单 - 希望是一个单行程序。本质上我想为数组编写一个异步处理程序,它为数组中的每个项目执行一些异步工作,并回调有关数组上的所有工作:(A)在数组中的每个项目成功处理异步后,或者(B)如果有任何错误,尽可能早退出 - 但仅限于主回调被恰好调用一次。

希望得到适用于浏览器和节点的答案:

// @items - an array
// @cb - callback after all of `items` processed, taking an optional Error first argument
function doForEachAndCb(items, cb) {
  var exitEarly, tasksRemaining;
  if (!items || typeof items !== 'object' || !items.length) {
    cb();
    return;
  }

  tasksRemaining = items.length;
  exitEarly = false;

  function finishOneTask(err) {
    // finishOneTask() is no-op if previously called with an error passed.
    if (exitEarly) {
      return;
    }
    if (!!err) {
      exitEarly = true;
      cb(err);
      return;
    }
    tasksRemaining--;
    if (tasksRemaining === 0) {
      cb();
    }
  }

  items.map( (v) => {
    try {
      handleItemAsync(items[v], finishOneTask);
    } catch (err2) {
      finishOneTask(err2);
    }
  });
}

1 个答案:

答案 0 :(得分:0)

结帐async#map()

async.map(items, (item, callback) => {
  // do something async
  ...
  // when async operation has finished, call
  // the callback with the mapped value
  callback(null, value);
}, (err, mappedItems) => {
  ...
});

如果您不需要构建映射值数组,则可以使用async#each代替。

async#map()async#each()都有顺序版本,其中每个项目仅在前一个处理步骤完成后处理(“常规”版本并行处理所有项目):{{1 }和async#mapSeries()