Saya memiliki struktur seperti array yang memperlihatkan metode async. Metode asinkron memanggil struktur larik yang dikembalikan yang pada gilirannya mengekspos lebih banyak metode asinkron. Saya membuat objek JSON lain untuk menyimpan nilai yang diperoleh dari struktur ini, jadi saya harus berhati-hati dalam melacak referensi di callback.
Saya telah membuat kode solusi brute force, tetapi saya ingin mempelajari solusi yang lebih idiomatis atau bersih.
- Pola tersebut harus dapat diulang untuk n tingkat penumpukan.
- Saya perlu menggunakan promise.all atau beberapa teknik serupa untuk menentukan kapan harus menyelesaikan rutinitas penutup.
- Tidak setiap elemen harus melibatkan pembuatan panggilan asinkron. Jadi dalam janji bersarang saya tidak bisa begitu saja membuat tugas ke elemen array JSON saya berdasarkan indeks. Namun demikian, saya perlu menggunakan sesuatu seperti promise.all di forEach bersarang untuk memastikan bahwa semua penugasan properti telah dilakukan sebelum menyelesaikan rutinitas pelampiran.
- Saya menggunakan lib promise bluebird tetapi ini bukan persyaratan
Berikut adalah beberapa kode parsial -
var jsonItems = [];
items.forEach(function(item){
var jsonItem = {};
jsonItem.name = item.name;
item.getThings().then(function(things){
// or Promise.all(allItemGetThingCalls, function(things){
things.forEach(function(thing, index){
jsonItems[index].thingName = thing.name;
if(thing.type === 'file'){
thing.getFile().then(function(file){ //or promise.all?
jsonItems[index].filesize = file.getSize();
javascript
node.js
asynchronous
promise
pengguna3205931
sumber
sumber
Promise.map
(bersamaan) danPromise.each
(berurutan) dalam hal ini, juga catatanPromise.defer
tidak digunakan lagi - kode dalam jawaban saya menunjukkan cara menghindarinya dengan mengembalikan janji. Janji adalah tentang nilai kembali.Jawaban:
Ini cukup mudah dengan beberapa aturan sederhana:
then
, kembalikan - janji apa pun yang tidak Anda kembalikan tidak akan ditunggu di luar..all
itu - dengan cara itu menunggu semua janji dan tidak ada kesalahan dari salah satunya yang dibungkam.then
, Anda biasanya dapat kembali ke tengah -then
rantai biasanya sedalam paling banyak 1 tingkat.Dan beberapa tip:
.map
daripada denganfor/push
- jika Anda memetakan nilai dengan suatu fungsi,map
memungkinkan Anda secara ringkas mengekspresikan gagasan tentang menerapkan tindakan satu per satu dan menggabungkan hasilnya.Promise.all
daripada mengeksekusi sesuatu satu demi satu - masing-masing menunggu sebelum yang berikutnya.Oke, jadi mari kita mulai:
sumber
Berikut adalah contoh sederhana menggunakan reduce. Ini berjalan secara serial, memelihara urutan penyisipan, dan tidak memerlukan Bluebird.
Dan gunakan seperti ini:
Kami merasa berguna untuk mengirim konteks opsional ke dalam loop. Konteksnya opsional dan dibagikan oleh semua iterasi.
Fungsi promise Anda akan terlihat seperti ini:
sumber
Saya telah melalui situasi yang sama. Saya menyelesaikannya menggunakan dua Promise.All ().
Saya pikir itu solusi yang sangat bagus, jadi saya menerbitkannya di npm: https://www.npmjs.com/package/promise-foreach
Saya pikir kode Anda akan menjadi seperti ini
sumber
Hanya untuk menambah solusi yang disajikan, dalam kasus saya, saya ingin mengambil banyak data dari Firebase untuk daftar produk. Inilah cara saya melakukannya:
sumber