Асинхронный модуль 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.autoInject
async.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) => {
// ...
}
])
таким образом вы не будете выдергивать волосы, пытаясь убедиться, что аргументы функции имеют правильную длину. Первая функция принимает только один аргумент - обратный вызов. Все остальные должны принимать два аргумента - значение и обратный вызов. Придерживайтесь шаблона, и вы останетесь в здравом уме!