Async: El uso de async / await dentro de la cadena async.auto conduce a TypeError: la devolución de llamada no es una función

Creado en 24 sept. 2018  ·  5Comentarios  ·  Fuente: caolan/async

¿Qué versión de async estás usando?
2.6.1

¿En qué entorno ocurrió el problema (versión de nodo / versión del navegador)?
8.11.3

¿Qué hiciste?
Suponiendo que fileObj se suministra desde el exterior:

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

Qué esperabas que sucediera?
Una vez que collectData finaliza la ejecución, filterData debe comenzar la ejecución del parámetro pasado dentro de la función collectCB

¿Cuál fue el resultado real?
TypeError: collectCB no es una función.

El mismo código se ejecuta bien con la versión 2.0.1 pero después de actualizar a 2.6.1 ha dejado de funcionar y es crítico para nosotros. También se agradecerá cualquier solución alternativa.

docs question

Comentario más útil

Tratamos las funciones async manera diferente, no les pasamos una devolución de llamada. En su lugar, simplemente return un valor (o throw un error).

Todos 5 comentarios

Tratamos las funciones async manera diferente, no les pasamos una devolución de llamada. En su lugar, simplemente return un valor (o throw un error).

Sí, aprendí lo mismo de StackOverflow y, por lo tanto, publicando una referencia a lo mismo aquí, en caso de que alguien se encuentre con esto en el futuro: Using-async-await-inside-async-auto-chain

Esto también se aplica a async.parallel si las funciones son asincrónicas, debe devolver el valor, no llamar a la devolución de llamada. Esto debería agregarse a la documentación y los ejemplos.

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

Me gustaría volver a escribir muchos de los ejemplos en los documentos para usar más async / await, para resaltar lo que puede hacer ahora.

Más que características en este paquete, necesitamos documentos. Será genial ver más ejemplos en el futuro.

¿Fue útil esta página
0 / 5 - 0 calificaciones