Async: Usar async / await dentro da cadeia async.auto leva a TypeError: o retorno de chamada não é uma função

Criado em 24 set. 2018  ·  5Comentários  ·  Fonte: caolan/async

Qual versão do assíncrono você está usando?
2.6.1

Em qual ambiente o problema ocorreu (versão do nó / versão do navegador)
8.11.3

O que você fez?
Supondo que fileObj seja fornecido de fora:

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);
  }],
})

O que você esperava que fosse acontecer?
Depois que collectData terminar a execução, filterData deve começar a execução do parâmetro passado na função collectCB

Qual foi o resultado real?
TypeError: collectCB não é uma função.

O mesmo código executa bem com a versão 2.0.1, mas após a atualização para 2.6.1 ele parou de funcionar e é crítico para nós. Qualquer solução alternativa também será apreciada.

docs question

Comentários muito úteis

Tratamos as funções async diferente - não passamos a elas um retorno de chamada. Em vez disso, simplesmente return a valor (ou throw um erro).

Todos 5 comentários

Tratamos as funções async diferente - não passamos a elas um retorno de chamada. Em vez disso, simplesmente return a valor (ou throw um erro).

Sim, aprendi sobre o mesmo com StackOverflow e postando uma referência ao mesmo aqui, caso alguém se depare com isso no futuro: Using-async-await-inside-async-auto-chain

Isso também se aplica a async.parallel se as funções forem assíncronas, você precisará retornar o valor e não chamar o retorno de chamada. Isso deve ser adicionado à documentação e aos exemplos.

        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);
        });

Eu gostaria de reescrever muitos dos exemplos nos documentos para usar mais async / await, para destacar o que você pode fazer agora.

Mais do que recursos neste pacote, precisamos de documentos. Será ótimo ver mais exemplos no futuro

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

ashoksahoo picture ashoksahoo  ·  3Comentários

AaronAcerboni picture AaronAcerboni  ·  3Comentários

parky128 picture parky128  ·  5Comentários

Saevon picture Saevon  ·  4Comentários

codeofsumit picture codeofsumit  ·  4Comentários