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

Созданный на 24 сент. 2018  ·  5Комментарии  ·  Источник: caolan/async

Какую версию async вы используете?
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 он перестал работать и это критично для нас. Любые обходные пути также будут оценены.

docs question

Самый полезный комментарий

Мы относимся к функциям async другому - мы не передаем им обратный вызов. Вместо этого просто return значение (или throw - ошибка).

Все 5 Комментарий

Мы относимся к функциям async другому - мы не передаем им обратный вызов. Вместо этого просто return значение (или throw - ошибка).

Да, узнал о том же из StackOverflow и поэтому разместил ссылку на то же самое здесь, на случай, если кто-то наткнется на это в будущем: Использование-async-await-inside-async-auto-chain

Это также относится к async.parallel, если функции являются асинхронными, вам нужно вернуть значение, а не вызывать обратный вызов. Это следует добавить в документацию и примеры.

        async.parallel({
            // NOTE: for async functions just return value or throw error
            // don't use the callback
            dates: async function(callback) {
                var rr = await getDates(dbName, r.indi, idx);
                return rr;
             },
             sdates: async function(callback) {
                  var rr = await getDates(dbName, r.spouse, idx);
                  return rr;
             },
             cdates: async function(callback) {
                  var rr = await getDates(dbName, r.cindi, idx);
                  return rr;
             }
        },
        function(err, results) {
             console.log(results);
        });

Я хотел бы переписать множество примеров в документации, чтобы использовать больше async / await, чтобы подчеркнуть, что вы можете сделать сейчас.

Нам нужны не только функции этого пакета, но и документы. Будет здорово увидеть больше примеров в будущем

Была ли эта страница полезной?
0 / 5 - 0 рейтинги