await q.push(task)
momentan nicht sicher verwendet werden, da das von q.push
Promise weder aufgelöst noch abgelehnt wird, wenn der Warteschlangen-Worker einen Fehler ausgibt. Ich verstehe, dass await q.push(task)
aufgrund der Abwärtskompatibilität dieser Methode und ihres optionalen Callback-Parameters (der Push-and-Forget-Funktion) keinen Fehler auslösen kann. Eine q.asyncPush(task)
Methode, die ihr Versprechen ablehnt, sollte nicht durchführbar sein?
Sie können das Problem mit diesem Code anzeigen (im Node oder Browser ohne die Anforderung):
const async = require('async');
let pushResult;
(async () => {
const q = async.queue(async (task) => {
throw new Error('Bad thing');
});
try {
pushResult = q.push({some: 'data'});
await pushResult;
console.log('Error not catched');
} catch (e) {
console.log('Error catched');
}
})();
setTimeout(() => {
console.log('exit');
console.log(pushResult);
}, 1000);
_Ursprünglich gepostet von @darksabrefr in https://github.com/caolan/async/pull/1641#issuecomment -498191809_
Ich erwäge, q.push()
mit dem Fehlerobjekt aufzulösen. Wäre das ausreichend? Ich möchte der großen Mehrheit der queue
Benutzer wirklich keine unhandledRejection
s geben.
Die Lösung mit einem Fehler kann eine Option sein, aber Sie müssen die Rückgabe von q.push
testen, es ist nicht wirklich ein konventionelles Muster (kein try
/ catch
/ finally
Block oder .then()
/ .catch()
Methoden können verwendet werden). Direkte Ablehnungen sind keine Option, ich stimme dem zu, es ist eine große Änderung. Für mich gibt es noch 2 andere Möglichkeiten:
q.asyncPush
Methode, die ein Versprechen zurückgibt, das abgelehnt werden kann. Vielleicht der einfachste und klarste Weg, da die Promise- und Callback-APIs vollständig getrennt werden können.q.push
als zweiter Parameter von Das wirklich wichtige ist, dass Versprechen nicht ewig ausstehen, also kannst du die beste Option auswählen, die du denkst ;-)
Ich mag die asyncPush
Idee.
Vielen Dank !
@aearly wurde das jemals implementiert?
Es war, siehe https://caolan.github.io/async/v3/docs.html#QueueObject : pushAsync
Hilfreichster Kommentar
Ich mag die
asyncPush
Idee.