Я использую асинхронный водопад, почему обратный вызов не является функцией?

#node.js #asynchronous #waterfall

#node.js #асинхронный #водопад

Вопрос:

Я понимаю это:

Ошибка: TypeError: обратный вызов не является функцией

Код:

 var async = require('async');

async.waterfall([
  (callback) => {
    callback(null, 'test');
  },
  async (value1, callback) => {
    const data = await send("http://google.com/search?q=" value1);

    callback(null, data); //TypeError: cb is not a function
  }
], (err) => {
  if (err) throw new Error(err);
});
  

почему это может быть ошибкой? несмотря на то, что «обратный вызов» является функцией async.waterfall по умолчанию. разве это невозможно в асинхронной функции, в которую я помещаю асинхронную функцию?

Ответ №1:

Когда вы используете async в функции внутри водопада, нет callback аргумента. Вместо вызова callback(null, data) вы разрешаете data .

 async.waterfall([
  (callback) => {
    callback(null, 'test');
  },
  async value1 => {
    const data = await send("http://google.com");

    return data;
  },
  (value1, callback) => {
     // value1 is the resolve data from the async function
  }
], (err) => {
  if (err) throw new Error(err);
});
  

Из документов:

Везде, где мы принимаем асинхронную функцию в стиле узла, мы также напрямую принимаем асинхронную функцию ES2017. В этом случае асинхронной функции не будет передан окончательный аргумент обратного вызова, и любая выданная ошибка будет использоваться в качестве аргумента err неявного обратного вызова, а возвращаемое значение будет использоваться в качестве результирующего значения. (т. е. отклоненное возвращенное обещание становится аргументом обратного вызова err, а разрешенное значение становится результатом.)