我想在完成对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);
});
答案 0 :(得分:0)
您要在异步上下文中添加数组OrderProducts的元素,这句话很关键:“ 完成后,所有对PrevOrders数组的推送”。
您当前不等待所有异步调用完成。您需要收集所有正在生成的承诺,然后等待所有承诺完成后才能访问数据。
Promise.all(myArrayOfPromises).then(
() => { /* access your data */ }
)
最重要的是,您还具有来自订阅可观察对象的附加异步上下文。假设您只能从该订阅中获得一个价值,则需要将其转换为一个Promise,并将其添加到必须等待的Promise列表中。