await q.push(task)
tidak aman untuk digunakan saat ini karena janji yang dikembalikan oleh q.push
tidak pernah menyelesaikan atau menolak jika pekerja antrian membuat kesalahan. Saya mengerti bahwa await q.push(task)
tidak dapat membuat kesalahan karena kompatibilitas mundur dari metode ini dan parameter panggilan balik opsionalnya (fitur push and forget). Metode q.asyncPush(task)
yang menolak janjinya seharusnya tidak layak ?
Anda dapat menunjukkan masalah dengan kode ini (di node atau browser tanpa perlu):
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);
_Awalnya diposting oleh @darksabrefr di https://github.com/caolan/async/pull/1641#issuecomment -498191809_
Saya sedang mempertimbangkan untuk membuat q.push()
menyelesaikan dengan objek kesalahan. Apakah itu cukup? Saya benar-benar tidak ingin memberikan unhandledRejection
s kepada sebagian besar pengguna queue
.
Menyelesaikan dengan kesalahan mungkin merupakan opsi tetapi Anda perlu menguji pengembalian q.push
, itu bukan pola konvensional yang menjanjikan (tidak try
/ catch
/ finally
Metode .then()
/ .catch()
dapat digunakan dengan). Penolakan langsung bukanlah pilihan, saya setuju dengan itu, ini adalah modifikasi besar. Bagi saya, ada 2 kemungkinan lain:
q.asyncPush
yang mengembalikan janji yang dapat ditolak. Mungkin cara termudah dan paling jelas karena API janji dan panggilan balik dapat sepenuhnya dipisahkan.q.push
untuk mengaktifkan janji-janji yang ditolak.Yang paling penting adalah janji tidak akan tertunda selamanya, jadi Anda dapat memilih opsi terbaik menurut Anda ;-)
Saya suka ide asyncPush
.
Terima kasih banyak !
@aearly apakah ini pernah diterapkan?
Itu, lihat https://caolan.github.io/async/v3/docs.html#QueueObject : pushAsync
Komentar yang paling membantu
Saya suka ide
asyncPush
.