gpt4 book ai didi

javascript - 如何在 firebase 中使用 promises?

转载 作者:行者123 更新时间:2023-11-29 20:58:49 24 4
gpt4 key购买 nike

最近我被一个问题困住了,不知道如何解决。我问了this问题,经过一些努力,我们发现 Firebase 处理 promise 的方式与正常请求不同,我无法正确使用它们。
the question 中所述,我正在用来自 Firebase 的一些信息填充数组,当我确定数组已填充时,我需要调用另一个方法,换句话说,当我确定对 Firebase 的调用已完成时。这是我现在使用的代码:

var user_pref = firebase.database().ref('/users/'+ self.api.email_id+'/preferenze/');
var ref = firebase.database().ref('/tag/')
var userTags = [];
var self1 = self;
user_pref.once('value', function(preferenze) {
preferenze.forEach(function(t) {
ref.once('value', function(tags) {
tags.forEach(function(t1) {
if (t.key == t1.key) {
console.log("Found " + t1.key)
userTags.push(t1.key)
}
return false;
});
})
return false;
});
}).then(a =>{
await this.sleep(1000) //----> WORKAROUND
console.log("Out")
this.myTags = userTags
this.findPoiByTag(this.myTags) //method I have to call when finished
})

我在 sleep 中使用了这个糟糕的解决方法,以确保外部代码在内部代码之后执行。如果没有它,它会先打印“Out”,然后再打印循环中的所有“Found”。我已经尝试以各种方式将它与 promises 一起使用,但它仍然不起作用。看看 docs here我找不到任何可以帮助我的东西。

最佳答案

这确实很糟糕。

这应该更接近您的需要:

var userTags = [];
var self1 = self;
user_pref.once('value', function(preferenze) {
var promises = [];
preferenze.forEach(function(t) {
promises.push(ref.child(t.key).once('value'));
});
Promise.all(promises).then(function(snapshots) {
snapshots.forEach(function(snapshot) {
if (snapshot.exists()) {
userTags.push(snapshot.key);
}
});
})
this.myTags = userTags
this.findPoiByTag(this.myTags) //method I have to call when finished
});

这有什么不同:

  1. 它直接加载每个首选项键(消除了对加载过多数据的深层嵌套循环的需要)。
  2. 它将所有类别的负载放入一个 promise 数组中。
  3. 然后在所有 promise 都已解决后调用您的函数。

关于javascript - 如何在 firebase 中使用 promises?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47795594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com