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/ awaitdapat membuat perangkap yang sama menjadi lebih mengejutkan. Membandingkan:
let p = new Promise(resolve => {
""();
resolve();
});
(async () => {
await p;
})().catch(e => console.log("Caught: " + e));
dengan asyncpadanan 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 .thenAnda sendiri).
Yang kedua tidak berfungsi karena ada pengecualian langsung dalam suatu asyncfungsi menolak janji implisit yang dikembalikan oleh asyncfungsi itu sendiri .
Karena nilai hasil dari fungsi pelaksana konstruktor promise tidak digunakan, itu berita buruk!
Kode Anda
Tidak ada alasan Anda tidak dapat mendefinisikan myFunctionsebagai 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?