javascript-“;然后";在firebase中循环完成之前执行
编辑:根据答案建议,使用承诺更改代码。它在添加所有标签之前进行打印,然后找到各种标签 我有以下代码用Firebase的一些密钥填充数组:javascript-“;然后";在firebase中循环完成之前执行,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,编辑:根据答案建议,使用承诺更改代码。它在添加所有标签之前进行打印,然后找到各种标签 我有以下代码用Firebase的一些密钥填充数组: var userTags = []; var arrayPromises = []; user_pref.once('value', function(preferenze){ preferenze.forEach(function(t){ ref.once('value', function(tags){ arrayPromises.push(a
var userTags = [];
var arrayPromises = [];
user_pref.once('value', function(preferenze){
preferenze.forEach(function(t){
ref.once('value', function(tags){
arrayPromises.push(arrayPromises.push(new Promise(function (resolve, reject) {
tags.forEach(function (t1){
if(t.key == t1.key){
console.log("Found " + t1.key)
}
return false;
})}));
})
return false;
})
})
Promise.all(arrayPromises).then(()=>{
console.log("Added all tags")
})
}
我添加了then
子句,以确保我在填充数组后调用方法findPoiByTag
,但显然then
中的代码是在其余部分之前执行的。事实上,消息lenght 2:
是在另一条消息lenght
之前打印的,因此它首先打印“0”,然后在填充数组时打印正确的长度
编辑:它以与forEach迭代次数相等的时间打印数组长度,因此return false
语句不会中断循环
我一直使用这种方法等待指令完成,为什么现在不起作用?我错过了什么吗?哦,我现在明白了,then函数在push函数之后,而不是forEach函数之后,所以你必须这样做
var arrayPromises = []
forEach(
push(
...
generatePromise
...
).then(
...
promiseRecieved
checkForAllPromisesRecieved(doTheThing)
... ) )
function doTheThing(){
this.myTags = userTags;
console.log("Lenght 2: " + userTags.length)
this.findPoiByTag(this.myTags);
}
如果我删除“return false”,它会给我一个错误,说我必须返回一个布尔值。我以前使用过此代码,与此相同,Firebase的使用需要此构造。它通常不会在返回false时停止,因为它需要返回false。另外,如果它真的在第一次迭代后返回,那么它将只打印一次数组的长度,而不是每次迭代都打印它。哦,我现在明白了,then函数在push函数之后,而不是在forEach之后,因此您必须执行类似于var arrayPromises=[]forEach(push(…generatePromise…)的操作.然后(…promiserecived…)//在所有承诺之后。myTags=userTags;log(“Lenght 2:+userTags.length)this.findPoiByTag(this.myTags);我换了答案:)谢谢!我不知道如何使用承诺,我已经更改了问题中的代码,以向您展示我是如何使用承诺的,因为它不像我那样工作良好:\