Async: como fazer o assíncrono funcionar com async / await

Criado em 14 fev. 2019  ·  10Comentários  ·  Fonte: 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");

Eu me pergunto por que obtive este resultado:

$ node test.js
1 undefined
2 undefined
question

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

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 comentários

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

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