Async: cómo hacer que async funcione con async / await

Creado en 14 feb. 2019  ·  10Comentarios  ·  Fuente: caolan/async

var async = require('async');

var workPool = async.queue(async (task, taskComplete)=>{
  console.log(1, taskComplete);

  async.retry(3, async (retryComplete)=>{

    console.log(2, retryComplete);
    // retryComplete(null, task);

  });
});

workPool.push("test");

Me pregunto por qué obtuve este resultado:

$ node test.js
1 undefined
2 undefined
question

Comentario más útil

@pawelotto Creo que para eso puedes usar node promisify util, no lo

Entonces, el ejemplo anterior se convertirá (sin errores de manejo):

import async from "async"
import {promisify} from "util"

const promiseMapLimit = promisify(async.mapLimit)
const results = await promiseMapLimit(files, async file => { // <- no callback!
    const text = await util.promisify(fs.readFile)(dir + file, 'utf8')
    const body = JSON.parse(text) // <- a parse error herre will be caught automatically
    if (!(await checkValidity(body))) {
        throw new Error(`${file} has invalid contents`) // <- this error will also be caught
    }
    return body // <- return a value!
})

Todos 10 comentarios

https://caolan.github.io/async/

Async acepta funciones async siempre que aceptemos una función de devolución de llamada de estilo Node. Sin embargo, no les pasamos una devolución de llamada, sino que usamos el valor de retorno y manejamos cualquier rechazo de promesa o error.

async.mapLimit(files, async file => { // <- no callback!
    const text = await util.promisify(fs.readFile)(dir + file, 'utf8')
    const body = JSON.parse(text) // <- a parse error herre will be caught automatically
    if (!(await checkValidity(body))) {
        throw new Error(`${file} has invalid contents`) // <- this error will also be caught
    }
    return body // <- return a value!
}, (err, contents) => {
    if (err) throw err
    console.log(contents)
})

Sí, Async no pasa devoluciones de llamada a las funciones async , solo regresa cuando se completa la tarea.

¿Y qué hay de devolver valores de la función de devolución de llamada final (en lugar de registrarlos en la consola como en este ejemplo)?

Solo los valores return ing de las funciones async funcionan en la mayoría de los casos.

¿Qué función async devuelve exactamente un valor? Por lo que he comprobado, regresan vacíos, por ejemplo
hacer hasta

@pawelotto Creo que para eso puedes usar node promisify util, no lo

Entonces, el ejemplo anterior se convertirá (sin errores de manejo):

import async from "async"
import {promisify} from "util"

const promiseMapLimit = promisify(async.mapLimit)
const results = await promiseMapLimit(files, async file => { // <- no callback!
    const text = await util.promisify(fs.readFile)(dir + file, 'utf8')
    const body = JSON.parse(text) // <- a parse error herre will be caught automatically
    if (!(await checkValidity(body))) {
        throw new Error(`${file} has invalid contents`) // <- this error will also be caught
    }
    return body // <- return a value!
})

Tal vez puedas probar neo-async

@kazaff genial, no lo sabía, ¡gracias!

@kazaff Legend!

@kazaff cómo usar neo-async en la respuesta de b4dnewz, simplemente no devuelve reulst

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