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");
Eu me pergunto por que obtive este resultado:
$ node test.js
1 undefined
2 undefined
https://caolan.github.io/async/
Async aceita funções assíncronas sempre que aceitamos uma função de retorno de chamada no estilo Node. No entanto, não passamos a eles um retorno de chamada e, em vez disso, usamos o valor de retorno e tratamos de quaisquer rejeições de promessa ou erros lançados.
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) })
Sim, o Async não passa callbacks para async
functions - apenas retorne quando a tarefa for concluída.
E quanto ao retorno de valores da função de retorno de chamada final (em vez de registrá-los no console, como neste exemplo)?
Apenas return
ing valores das funções async
funcionam na maioria dos casos.
Qual async
função retorna exatamente um valor? Pelo que verifiquei, eles retornam nulos, por exemplo
até
@pawelotto Acho que para isso você pode usar o utilitário node
Portanto, o exemplo acima se tornará (sem tratamento de erros):
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!
})
Talvez você possa tentar neo-async
@kazaff legal, não sabia, obrigado!
@kazaff Legend!
@kazaff como usar neo-async na resposta de b4dnewz, apenas falhe em retornar reulst
Comentários muito úteis
@pawelotto Acho que para isso você pode usar o utilitário node
Portanto, o exemplo acima se tornará (sem tratamento de erros):