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
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
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):