最近我被一个问题困扰,不知道如何解决。我问this https://stackoverflow.com/questions/47775150/javascript-then-executing-before-the-loop-completes-in-firebase/47775453问题,经过一番努力,我们发现 Firebase 的 Promise 工作方式与正常请求不同,而且我无法正确使用它们。
正如中所解释的问题 https://stackoverflow.com/questions/47775150/javascript-then-executing-before-the-loop-completes-in-firebase/47775453,我正在用 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
})
我正在使用这种可怕的解决方法与睡眠,以确保外部代码在内部代码之后执行。如果没有它,它会先打印“Out”,然后打印循环中的所有“Found”。我已经尝试以各种方式使用它与承诺,但它仍然不起作用。看看文档在这里 https://firebase.google.com/docs/functions/terminate-functions?hl=en我找不到任何可以帮助我的东西。
这确实很糟糕。
这应该更接近您所需要的:
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
});
这有什么不同之处:
- 它通过直接查看加载每个首选项键(消除了加载过多数据的深层嵌套循环的需要)。
- 它将所有类别的负载放入一系列承诺中。
- 然后,它会在所有承诺都解决后调用您的函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)