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_に投稿されました
エラーオブジェクトを使用してq.push()
解決することを検討しています。 それで十分でしょうか? 私は本当にqueue
ユーザーの大多数にunhandledRejection
を与えたくありません。
エラーで解決することもできますが、 q.push
リターンをテストする必要があります。これは、従来のパターンではありません( try
/ catch
/ finally
はありません)。 .then()
/ .catch()
メソッドを使用できます)。 直接拒否はオプションではありません、私はそれに同意します、それは主要な変更です。 私にとって、他に2つの可能性があります。
q.asyncPush
メソッド。 promise APIとcallbackAPIを完全に分離できるため、おそらく最も簡単で明確な方法です。q.push
2番目のパラメーターとしてのブール値は拒否されます。本当に重要なことは、約束が永遠に保留されることはないので、あなたが思う最良のオプションを選択できるということです;-)
私はasyncPush
アイデアが好きです。
どうもありがとうございました !
@aearlyこれはこれまでに実装されましたか?
最も参考になるコメント
私は
asyncPush
アイデアが好きです。