Я нахожу, что в моем коде много чего пишу, и я уверен, что там есть стандартная библиотека, которая делает это намного проще - надеюсь, один лайнер. По сути, я хочу написать обработчик async для массива, который выполняет некоторую асинхронную работу за элемент в массиве и обращается ко всей работе над массивом: (A) после того, как каждый отдельный элемент массива успешно обработан асинхронным способом или (B), если возникла какая-либо ошибка, если возможно, выходить рано, но только так, что мастер-вызов вызывается точно один раз.Какая библиотека или шаблон уменьшает шаблон для этого количества cb до 1 cb?
Надеясь на ответ, который работает как для браузера и узла:
// @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);
}
});
}
Соответствующая именованная библиотека [Async.js] (https://github.com/caolan/async) хороша для общих утилит обратного вызова. –