Tapi sepertinya itu bukan cara yang tepat untuk melakukannya ..
Itu memang cara yang tepat untuk melakukannya (atau setidaknya sebuah cara yang tepat untuk melakukannya). Ini adalah aspek kunci dari promise, ini adalah pipeline, dan data dapat dipijat oleh berbagai penangan di pipeline.
Contoh:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("First handler", data);
return data.map(entry => entry * 10);
})
.then(data => {
console.log("Second handler", data);
});
( catch
penangan dihilangkan agar singkatnya. Dalam kode produksi, selalu sebarkan janji, atau tangani penolakan.)
Output yang kami lihat dari itu adalah:
Penangan pertama [1,2]
Penangan kedua [10,20]
... karena penangan pertama mendapatkan resolusi dari dua janji ( 1
dan 2
) sebagai larik, lalu membuat larik baru dengan masing-masing dikalikan dengan 10 dan mengembalikannya. Pawang kedua mendapatkan apa yang dikembalikan pawang pertama.
Jika pekerjaan tambahan yang Anda lakukan sinkron, Anda juga dapat meletakkannya di penangan pertama:
Contoh:
const promises = [
new Promise(resolve => setTimeout(resolve, 0, 1)),
new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
.then(data => {
console.log("Initial data", data);
data = data.map(entry => entry * 10);
console.log("Updated data", data);
return data;
});
... tetapi jika asinkron, Anda tidak akan ingin melakukannya karena akhirnya menjadi bersarang, dan penumpukan dapat dengan cepat menjadi tidak terkendali.
reject
mendapatkan nilai setelahPromise
fungsi awal ? Atau akankah melempar kesalahan di mana saja dalam rantai membawa Anda ke.catch()
? Jika demikian, apa gunanyareject
sejak awal? Mengapa tidak membuang kesalahan saja? Terima kasih sekali lagi,resolve
danreject
. Saat Anda menangani , jika pemrosesan Anda gagal, Anda memang membuat pengecualian untuk memicu jalur kegagalan. Dan ya, Anda juga bisa memunculkan pengecualian dariPromise
callback asli (daripada menggunakanreject
), tetapi tidak semua kegagalan adalah pengecualian.return data
Pendekatan Anda benar, itu adalah contoh pengikatan janji . Jika Anda mengembalikan promise dari.then()
callback Anda , JavaScript akan menyelesaikan promise tersebut dan meneruskan data kethen()
callback berikutnya .Berhati-hatilah dan pastikan Anda menangani kesalahan dengan
.catch()
.Promise.all()
menolak segera setelah salah satu janji dalam array ditolak .sumber
Saat ini NodeJS mendukung
async/await
sintaks baru . Ini adalah sintaks yang mudah dan membuat hidup lebih mudahasync function process(promises) { // must be an async function let x = await Promise.all(promises); // now x will be an array x = x.map( tmp => tmp * 10); // proccessing the data. } const promises = [ new Promise(resolve => setTimeout(resolve, 0, 1)), new Promise(resolve => setTimeout(resolve, 0, 2)) ]; process(promises)
Belajarlah lagi:
sumber