ฉันมีโครงสร้างเหมือนอาร์เรย์ที่เปิดเผยเมธอด async เมธอด async เรียกใช้โครงสร้างอาร์เรย์ที่ส่งคืนซึ่งจะแสดงวิธีการ async มากขึ้น ฉันกำลังสร้างออบเจ็กต์ JSON อื่นเพื่อเก็บค่าที่ได้รับจากโครงสร้างนี้ดังนั้นฉันจึงต้องระมัดระวังในการติดตามการอ้างอิงในการเรียกกลับ
ฉันได้เขียนโค้ดวิธีแก้ปัญหาแบบเดรัจฉานแล้ว แต่ฉันต้องการเรียนรู้วิธีแก้ปัญหาที่เป็นสำนวนหรือสะอาดกว่านี้
- รูปแบบควรทำซ้ำได้สำหรับ n ระดับของการทำรัง
- ฉันจำเป็นต้องใช้คำมั่นสัญญาทั้งหมดหรือเทคนิคบางอย่างที่คล้ายกันเพื่อพิจารณาว่าเมื่อใดควรแก้ไขรูทีนการปิดล้อม
- ไม่ใช่ทุกองค์ประกอบที่จำเป็นต้องเกี่ยวข้องกับการโทรแบบ async ดังนั้นในสัญญาที่ซ้อนกันทั้งหมดฉันไม่สามารถกำหนดองค์ประกอบอาร์เรย์ JSON ของฉันตามดัชนีได้ อย่างไรก็ตามฉันจำเป็นต้องใช้บางอย่างเช่นคำสัญญาทั้งหมดในที่ซ้อนกัน forEach เพื่อให้แน่ใจว่ามีการกำหนดคุณสมบัติทั้งหมดก่อนที่จะแก้ไขรูทีนการปิดล้อม
- ฉันใช้ bluebird สัญญา lib แต่นี่ไม่ใช่ข้อกำหนด
นี่คือรหัสบางส่วน -
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
(พร้อมกัน) และPromise.each
(ตามลำดับ) ในกรณีนี้โน้ตPromise.defer
ก็เลิกใช้งาน - รหัสในคำตอบของฉันแสดงวิธีหลีกเลี่ยงโดยการคืนสัญญา คำสัญญาล้วนเกี่ยวกับการคืนค่า