Async: comment faire fonctionner async avec async/wait

Créé le 14 févr. 2019  ·  10Commentaires  ·  Source: 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");

Je me demande pourquoi j'ai ce résultat :

$ node test.js
1 undefined
2 undefined
question

Commentaire le plus utile

@pawelotto Je pense que pour cela, vous pouvez utiliser l' utilitaire de promesse de nœud, je n'ai pas testé mais comme la signature de la fonction de rappel principale est compatible, je suppose que cela fonctionnera.

L'exemple ci-dessus deviendra donc (sans erreur de manipulation) :

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

Tous les 10 commentaires

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

Async accepte les fonctions asynchrones partout où nous acceptons une fonction de rappel de style Node. Cependant, nous ne leur transmettons pas de rappel et utilisons à la place la valeur de retour et gérons les rejets de promesse ou les erreurs générées.

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

Oui, Async ne transmet pas de rappels aux fonctions async -- retourne simplement lorsque la tâche est terminée.

Et qu'en est-il du retour des valeurs de la fonction de rappel finale (au lieu de les enregistrer dans la console comme dans cet exemple) ?

Seules les valeurs return ing des fonctions async fonctionnent dans la plupart des cas.

Quelle fonction async renvoie exactement une valeur ? D'après ce que j'ai vérifié, ils retournent nuls, par exemple
faire jusqu'à ce que

@pawelotto Je pense que pour cela, vous pouvez utiliser l' utilitaire de promesse de nœud, je n'ai pas testé mais comme la signature de la fonction de rappel principale est compatible, je suppose que cela fonctionnera.

L'exemple ci-dessus deviendra donc (sans erreur de manipulation) :

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

Peut-être que vous pouvez essayer néo-async

@kazaff cool, je ne le savais pas, merci !

@kazaff Légende !

@kazaff comment utiliser neo-async dans la réponse de b4dnewz, échouez simplement à renvoyer reulst

Cette page vous a été utile?
0 / 5 - 0 notes