Javascript AngularFire2遍历对象数组并从实时数据库中获取数据

Javascript AngularFire2遍历对象数组并从实时数据库中获取数据,javascript,firebase,firebase-realtime-database,angularfire2,Javascript,Firebase,Firebase Realtime Database,Angularfire2,我必须浏览一系列项目并获取实时数据库中的价格,但我想在开始时显示加载消息,加载完成后,我想删除加载消息,但我这样做的方式不起作用,在加载结束前删除了: let loading = this.loadingCtrl.create({ content: 'Waiting...' }); loading.present(); for (let i = 0; i <= this.Cart.length - 1; i++) { let product = this.db.object('/

我必须浏览一系列项目并获取实时数据库中的价格,但我想在开始时显示加载消息,加载完成后,我想删除加载消息,但我这样做的方式不起作用,在加载结束前删除了:

let loading = this.loadingCtrl.create({
  content: 'Waiting...'
});
loading.present();

for (let i = 0; i <= this.Cart.length - 1; i++) {
  let product = this.db.object('/menuItems/' + this.Cart[i].item.itemId);
  product.valueChanges().subscribe((prodData: any) => {
      if (prodData != null) {
          this.Cart[i].item.price = prodData.price[0]; 
      }
  });
}
loading.dismiss();
let loading=this.loadingCtrl.create({
内容:“等待…”
});
loading.present();
for(设i=0;i{
if(prodData!=null){
此.Cart[i].item.price=prodData.price[0];
}
});
}
loading.dispose();

如何正确执行此操作?

您需要将加载指示器隐藏在订阅服务器中。最简单的方法是在第一个数据进入时将其隐藏:

for (let i = 0; i <= this.Cart.length - 1; i++) {
  let product = this.db.object('/menuItems/' + this.Cart[i].item.itemId);
  product.valueChanges().subscribe((prodData: any) => {
      if (prodData != null) {
          this.Cart[i].item.price = prodData.price[0]; 
      }
      loading.dismiss();
  });
}
for(设i=0;i{
if(prodData!=null){
此.Cart[i].item.price=prodData.price[0];
}
loading.dispose();
});
}
更棘手的一点是在所有数据返回后隐藏它,但不必太难。一个简单的方法是计算你得到了多少回复。一旦这与购物车中的物品数量相同,您就可以隐藏装载指示器

var responseCount = 0;
for (let i = 0; i <= this.Cart.length - 1; i++) {
  let product = this.db.object('/menuItems/' + this.Cart[i].item.itemId);
  product.valueChanges().subscribe((prodData: any) => {
      if (prodData != null) {
          this.Cart[i].item.price = prodData.price[0]; 
      }
      if (responseCount++ == this.Cart.length) loading.dismiss();
  });
}
var responseCount=0;
for(设i=0;i{
if(prodData!=null){
此.Cart[i].item.price=prodData.price[0];
}
如果(responseCount++==this.Cart.length)装入.discouse();
});
}

只是好奇,你为什么不使用Firestore。。。没有使用JavaScript的
Promise.all
以并行最佳实践获取这些价格,也就是说,将读取的每个db推入一个数组,然后
Promise.all
该数组。当承诺解决后,隐藏不确定加载器。嗨,罗恩,我是Firebase的新手,我不太确定如何做到这一点,你可以用承诺演示如何做到这一点。全部?谢谢。实际上没那么难:像
var myArray=[]
这样的东西,然后对于每个读操作
myArray.push(firebase.firestore().collection(“prices”).doc(itemId.get())
。然后在迭代之后,在填充数组之后,执行
Promise.all(myArray)。然后执行
。返回值将位于索引处。(记住,如果一次阅读失败,整个承诺都失败了)原谅我,我试过了,但我没有足够的声誉去投票。