Isu:
Dalam pengaturcaraan tak segerak tradisional, pelaksanaan operasi sedar berbilang serentak terhalang kerana berurutan pemprosesan.
Punca:
Kod yang dimaksudkan menunggu operasi menunggu pertama selesai sebelum memulakan yang kedua.
Cadangan Penyelesaian :
Cadangan awal untuk mendapatkan janji sebelum menunggunya secara berasingan memang membenarkan selari perlaksanaan. Walau bagaimanapun, ia memperkenalkan isu dengan pengendalian ralat dan kemungkinan ralat penolakan yang tidak dapat dikendalikan.
Pendekatan Disyorkan:
Daripada penyelesaian yang dicadangkan, kami mengesyorkan agar anda menggunakan Promise.all:
const [value1, value2] = await Promise.all([getValue1Async(), getValue2Async()]);
Kebaikan Promise.all:
Contoh:
Pertimbangkan contoh berikut yang menunjukkan perbezaan dalam pemasaan dan pengendalian ralat:
const getValue1Async = () => { return new Promise(resolve => { setTimeout(resolve, 500, "value1"); }); }; const getValue2Async = () => { return new Promise((resolve, reject) => { setTimeout(reject, 100, "error"); }); }; // Sequential execution with proposed solution (async () => { try { console.time("sequential"); const p1 = getValue1Async(); const p2 = getValue2Async(); const value1 = await p1; const value2 = await p2; } catch (e) { console.error(e); } console.timeEnd("sequential"); })(); // Concurrent execution with Promise.all setTimeout(async () => { try { console.time("concurrent"); const [value1, value2] = await Promise.all([getValue1Async(), getValue2Async()]); } catch (e) { console.timeEnd("concurrent", e); } }, 1000);
Dalam contoh pelaksanaan berurutan, kod menunggu 500ms untuk operasi pertama selesai sebelum memulakan operasi kedua. Sebaliknya, contoh pelaksanaan serentak mengendalikan kegagalan operasi kedua serta-merta selepas 100ms.
Atas ialah kandungan terperinci Bagaimanakah Promise.all Boleh Meningkatkan Serentak Menanti Pelaksanaan dan Pengendalian Ralat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!