Асинхронный модуль nodejs: https://github.com/caolan/async предоставляет 2 похожих метода async.waterfallи async.series.
В чем разница между ними?
Асинхронный модуль nodejs: https://github.com/caolan/async предоставляет 2 похожих метода async.waterfallи async.series.
В чем разница между ними?
Ответы:
Похоже, что это async.waterfallпозволяет каждой функции передавать свои результаты следующей функции, а async.seriesвсе результаты - конечному обратному вызову. На более высоком уровне async.waterfallэто будет для конвейера данных («дано 2, умножить на 3, добавить 2 и разделить на 17»), а async.seriesдля дискретных задач, которые должны выполняться по порядку, но в остальном являются отдельными.
waterfallне seriesвозвращается. Ожидается, что какой бы результат ни был, он будет использован в необязательном параметре обратного вызова.
Обе функции передают возвращаемое значение каждой функции следующей, а затем, когда это сделано, вызовут основной обратный вызов, передав его ошибку, если произойдет ошибка.
Разница в том async.series(), что после завершения серии все результаты передаются в основной обратный вызов. async.waterfall()передаст основному обратному вызову только результат последней вызванной функции.
async.waterfall()имеет дело с action that relies on the previous outcome.
async.series() имеет дело с действием, которое хочет see all the result at the end
Я считаю async.waterfall вредным, потому что его сложно реорганизовать после написания, а также он подвержен ошибкам, поскольку, если вы предоставите больше аргументов, другие функции сильно изменят подпись.
Я настоятельно рекомендую async.autoInjectasync.waterfall в качестве отличной альтернативы.
https://caolan.github.io/async/autoInject.js.html
Если вы все же решите использовать async.waterfall, я рекомендую хранить все в одном объекте, чтобы вашим функциям не приходилось изменять длину / подписи, например:
предупреждение: это плохой шаблон
async.waterfall([
cb => {
cb(null, "one", "two");
},
(one, two, cb) => {
cb(null, 1, 2, 3, 4);
},
(one,two,three,four,cb) => {
// ...
}
])
не делайте этого вышеописанным способом. Это гораздо лучший шаблон для использования:
async.waterfall([
cb => {
cb(null, {one:"one", two:"two"});
},
(v, cb) => {
cb(null, [1, 2, 3, 4]);
},
(v,cb) => {
// ...
}
])
таким образом вы не будете выдергивать волосы, пытаясь убедиться, что аргументы функции имеют правильную длину. Первая функция принимает только один аргумент - обратный вызов. Все остальные должны принимать два аргумента - значение и обратный вызов. Придерживайтесь шаблона, и вы останетесь в здравом уме!