Яка різниця між водоспадом async. і async.series


Відповіді:


168

Здається, що async.waterfallкожна функція дозволяє передати свої результати наступній функції, в той час як async.seriesпередає всі результати до остаточного зворотного виклику. На більш високому рівні це async.waterfallбуло б для конвеєра даних ("задано 2, помножте його на 3, додайте 2 і розділіть на 17"), тоді async.seriesяк для дискретних завдань, які повинні виконуватися в порядку, але інакше є окремими.


Чи можливо для будь-якої з цих двох функцій повернути значення? Я читав, що це можливо, але не можу знайти релевантну інформацію ніде в документації.
Андерсон Грін

1
@AndersonGreen: Ні. Дивлячись на джерело бібліотеки, ані значення waterfallне seriesповертає. Очікується, що незалежно від результату буде використано опціональний параметр зворотного виклику.
Twisol

Вищенаведена відповідь може бути правильною ще до 2012 року, але правильна - це те саме, що і наступна, а саме: серія (), як її називають, що ВСІ результати отримують як серію, передану до Кінцевого зворотного виклику, а водоспад - ОСТАННІЙ результат, переданий на остаточний зворотний виклик. Дивіться розробника Mozilla
Jeb50

53

Обидві функції передають повернене значення кожної функції наступній, тоді після завершення буде викликати основний зворотний виклик, передаючи його помилку, якщо помилка трапиться.

Різниця полягає в тому async.series(), що після закінчення серії передадуть усі результати до основного зворотного виклику. async.waterfall()перейде до основного зворотного дзвінка лише результат останньої викликаної функції.


1
Це повинна бути відповідь ;-)
Стюарт Аллен

@Mario "Обидві функції передають зворотний виклик попередньої функції" АБО "Обидві функції передають результат попередньої функції"?
user1451111

@ user1451111, Результат, хаха ... Я впевнений, що написав, що вперше ...

26

async.waterfall()має справу з action that relies on the previous outcome.

async.series() має справу з дією, яка хоче see all the result at the end


1
Дивовижно створені образи. Ви створили їх самостійно чи дістали десь ще?
користувач1451111

ви повинні поставити фотографії у відповідь, люди, ймовірно, пропустять їх о / ш
Олександр Міллс

1

Я вважаю, що падіння async. водопаду є шкідливим, тому що важко переробити один раз написане, а також схильне до помилок, оскільки якщо ви надаєте більше аргументів, інші функції значно змінюють підпис.

Я настійно рекомендую async.autoInjectяк чудову альтернативу асин. Водоспаду. 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) => {
     // ...
  }
])

таким чином ви не будете витягувати волосся, намагаючись переконатися, що аргументи функції мають правильну довжину. Перша функція приймає лише один аргумент - зворотний виклик. Усі решта повинні прийняти два аргументи - значення та зворотний виклик. Дотримуйтесь шаблону, і ви залишатиметесь здоровими!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.