Anda secara efektif menggunakan promise di dalam fungsi pelaksana konstruktor promise, jadi ini adalah anti-pola konstruktor Promise .
Kode Anda adalah contoh bagus dari risiko utama: tidak menyebarkan semua kesalahan dengan aman. Baca alasannya di sana .
Selain itu, penggunaan async
/ await
dapat membuat perangkap yang sama menjadi lebih mengejutkan. Membandingkan:
let p = new Promise(resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
dengan async
padanan yang naif (salah) :
let p = new Promise(async resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
Lihat di konsol web browser Anda untuk yang terakhir.
Yang pertama berfungsi karena setiap pengecualian langsung dalam fungsi pelaksana konstruktor Promise dengan mudah menolak janji yang baru dibuat (tetapi di dalam apa pun .then
Anda sendiri).
Yang kedua tidak berfungsi karena ada pengecualian langsung dalam suatu async
fungsi menolak janji implisit yang dikembalikan oleh async
fungsi itu sendiri .
Karena nilai hasil dari fungsi pelaksana konstruktor promise tidak digunakan, itu berita buruk!
Kode Anda
Tidak ada alasan Anda tidak dapat mendefinisikan myFunction
sebagai async
:
async function myFunction() {
let array = await getAsyncArray();
return new Promise((resolve, reject) => {
eachLimit(array, 500, (item, callback) => {
}, error => {
if (error) return reject(error);
});
});
}
Meskipun mengapa menggunakan pustaka kontrol konkurensi yang sudah ketinggalan zaman await
?