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