承诺与努力

时间:2018-12-01 12:55:10

标签: angular promise ionic3

我想在完成对PrevOrders数组的所有推送后获得订单。我尝试了不同的技术。当我操纵结果时,将打印数组,但无法获取它的大小,甚至无法操纵它。如何获得结果?

this.PrevOrders=[];
orderList.forEach(order=>{ 
  let orderObject= order.payload.toJSON();
  if(orderObject&&orderObject['status']=="Order Delivered"){
  let orderItems= 
    this.afdb.object(`/OrderItems/${order.key}`);
  orderItems.snapshotChanges().subscribe(items=>{
    let itemsO=items.payload.toJSON();
    let OrderProducts=[]; 
    if(itemsO){ 
      for (const key in itemsO) {
        if (itemsO.hasOwnProperty(key))
         {                
          this.afdb.database.ref(`/Items/${key}`)
          .child('type').once('value')
          .then(item=>{
            if(OrderProducts.indexOf(item.toJSON())==-1)
                OrderProducts.push(item.toJSON());
           });
         }
     }
    this.length=this.PrevOrders.push(OrderProducts);
    }
  });
 }
});
Promise.resolve(orderList).then(()=>{
  console.log(this.length);
  console.log(this.PrevOrders);
});

1 个答案:

答案 0 :(得分:0)

您要在异步上下文中添加数组OrderProducts的元素,这句话很关键:“ 完成后,所有对PrevOrders数组的推送”。

您当前不等待所有异步调用完成。您需要收集所有正在生成的承诺,然后等待所有承诺完成后才能访问数据。

Promise.all(myArrayOfPromises).then(
 () => { /* access your data */ }
)

最重要的是,您还具有来自订阅可观察对象的附加异步上下文。假设您只能从该订阅中获得一个价值,则需要将其转换为一个Promise,并将其添加到必须等待的Promise列表中。