Async: Awaitable q.push wird nicht aufgelöst, wenn der Warteschlangenarbeiter einen Fehler ausgibt

Erstellt am 6. Juni 2019  ·  6Kommentare  ·  Quelle: caolan/async

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_

bug feedback-wanted

Hilfreichster Kommentar

Ich mag die asyncPush Idee.

Alle 6 Kommentare

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:

  • eine eindeutige 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.
  • ein boolescher 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?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen