Async: En attente q.push ne se résout pas lorsque le travailleur de la file d'attente renvoie une erreur

Créé le 6 juin 2019  ·  6Commentaires  ·  Source: caolan/async

await q.push(task) n'est pas sûre pour le moment car la promesse renvoyée par q.push ne se résout ni ne rejette si le travailleur de la file d'attente renvoie une erreur. Je comprends que await q.push(task) ne peut pas générer d'erreur en raison de la compatibilité descendante de cette méthode et de son paramètre de rappel facultatif (la fonction push and forget). Une méthode q.asyncPush(task) qui rejette sa promesse ne devrait pas être faisable ?

Vous pouvez montrer le problème avec ce code (dans le nœud ou le navigateur sans l'exigence) :

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

_Publié à l'origine par @darksabrefr dans https://github.com/caolan/async/pull/1641#issuecomment -498191809_

bug feedback-wanted

Commentaire le plus utile

J'aime l'idée asyncPush .

Tous les 6 commentaires

J'envisage q.push() résoudre unhandledRejection s à la grande majorité des utilisateurs de queue .

Résoudre avec une erreur peut être une option mais vous devrez tester le retour q.push , ce n'est pas vraiment un modèle conventionnel de promesse (pas de try / catch / finally block ou les méthodes .then() / .catch() peuvent être utilisées avec). Les rejets directs ne sont pas une option, je suis d'accord, c'est une modification majeure. Pour moi, il y a 2 autres possibilités :

  • une méthode q.asyncPush distincte qui renvoie une promesse pouvant être rejetée. Peut-être le moyen le plus simple et le plus clair, car les API de promesse et de rappel peuvent être entièrement séparées.
  • un booléen comme second paramètre de q.push pour activer les promesses rejetées.

La chose vraiment importante est que les promesses ne seront pas en attente pour toujours, vous pouvez donc sélectionner la meilleure option que vous pensez ;-)

J'aime l'idée asyncPush .

Merci beaucoup !

@aearly a-t-il déjà été mis en œuvre ?

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