Использование async / await внутри цепочки async.auto приводит к TypeError: обратный вызов не является функцией - PullRequest
0 голосов
/ 25 сентября 2018

В какой версии асинхронного вы используете?

2.6.1

В какой среде возникла проблема (версия узла / версия браузера)

8.11.3

Что вы делали?Пожалуйста, включите минимальный воспроизводимый случай, иллюстрирующий проблему.

Предполагается, что fileObj поставляется извне:

async.auto({
  download: (downloadCB) => {
    if (fileObj) {
      fs.writeFile(__dirname + ‘fileNew.txt’, fileObj.content, 'base64', function (err) {
        if (err){
          return downloadCB(err);
        }
        return downloadCB(null , fileObj.generatedFileName); // works fine
      });
    } else {
      let err = new Error('File not found');
      return downloadCB(err);
    }
  },
  collectData: ['download', async (results, collectCB) => {
    console.log(typeof collectCB); // prints undefined
    console.log(typeof results); // prints correct object

    let res = await anHttpRequest();
    if (res.response && res.response.statusCode == 200) {
      return collectCB(null , 'fileCombined.txt'); // This is where the ISSUE happens
    }
    else if(res.response.statusCode >= 300) {
      return collectCB(new Error('Request failed inside async-auto'));
    }
  }],

  filterData: ['collectData', (results, filterCB) => {
    doFilter(results.collectData, filterCB);
  }],
})

Что вы ожидали случиться?

После того, как collectData заканчивает выполнение, filterData должно начать выполнение с параметром, переданным внутри функции collectCB

Каким был фактический результат?

TypeError: collectCB не является функцией.

Тот же код хорошо работает с версией 2.0.1, но после обновления до 2.6.1 он перестал работать, и это важно для нас.Любые обходные пути также будут оценены.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

на основе документации (цитируется уже в другом ответе, но здесь снова)

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

0 голосов
/ 25 сентября 2018

Просто копия-вставка из официальной документации :

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

...