Async: Q.push yang menunggu tidak menyelesaikan saat pekerja antrian membuat kesalahan

Dibuat pada 6 Jun 2019  ·  6Komentar  ·  Sumber: caolan/async

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_

bug feedback-wanted

Komentar yang paling membantu

Saya suka ide asyncPush .

Semua 6 komentar

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:

  • metode q.asyncPush yang mengembalikan janji yang dapat ditolak. Mungkin cara termudah dan paling jelas karena API janji dan panggilan balik dapat sepenuhnya dipisahkan.
  • sebuah boolean sebagai parameter kedua dari 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?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat