Async: キューワーカーがエラーをスローすると、待機可能なq.pushが解決されない

作成日 2019年06月06日  ·  6コメント  ·  ソース: caolan/async

await q.push(task)は、キューワーカーがエラーをスローした場合に、 q.pushによって返されるpromiseが解決も拒否もされないため、現時点では安全に使用できません。 このメソッドとそのオプションのコールバックパラメーター(プッシュアンドフォーゲット機能)の下位互換性のため、 await q.push(task)がエラーをスローできないことを理解しています。 その約束を拒否するq.asyncPush(task)メソッドは実行可能であるべきではありませんか?

このコードの問題を示すことができます(ノードまたはブラウザーでは必要ありません)。

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

_元々は@darksabrefrによってhttps://github.com/caolan/async/pull/1641#issuecomment-498191809_に投稿されまし

bug feedback-wanted

最も参考になるコメント

私はasyncPushアイデアが好きです。

全てのコメント6件

エラーオブジェクトを使用してq.push()解決することを検討しています。 それで十分でしょうか? 私は本当にqueueユーザーの大多数にunhandledRejectionを与えたくありません。

エラーで解決することもできますが、 q.pushリターンをテストする必要があります。これは、従来のパターンではありません( try / catch / finallyはありません)。 .then() / .catch()メソッドを使用できます)。 直接拒否はオプションではありません、私はそれに同意します、それは主要な変更です。 私にとって、他に2つの可能性があります。

  • 拒否できるpromiseを返す個別のq.asyncPushメソッド。 promise APIとcallbackAPIを完全に分離できるため、おそらく最も簡単で明確な方法です。
  • 約束をアクティブにするためのq.push 2番目のパラメーターとしてのブール値は拒否されます。

本当に重要なことは、約束が永遠に保留されることはないので、あなたが思う最良のオプションを選択できるということです;-)

私はasyncPushアイデアが好きです。

どうもありがとうございました !

@aearlyこれはこれまでに実装されましたか?

このページは役に立ちましたか?
0 / 5 - 0 評価