javascript-“;然后";在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

编辑:根据答案建议,使用承诺更改代码。它在添加所有标签之前进行打印,然后找到各种标签

我有以下代码用Firebase的一些密钥填充数组:

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);我换了答案:)谢谢!我不知道如何使用承诺,我已经更改了问题中的代码,以向您展示我是如何使用承诺的,因为它不像我那样工作良好:\