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();
Promise.map
(bersamaan) dan Promise.each
(berurutan) dalam hal ini, juga catatan Promise.defer
tidak digunakan lagi - kode dalam jawaban saya menunjukkan cara menghindarinya dengan mengembalikan janji. Janji adalah tentang nilai kembali.