javascript - “然后”在循环在firebase中完成之前执行

时间:2017-12-12 14:35:41

标签: javascript firebase firebase-realtime-database

编辑:使用promises更改了答案建议的代码。它会在Added all tags之前打印,然后在各种Found

之前打印

我有以下代码用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语句不会破坏循环。

我一直用这种方法等待指令完成,为什么现在不工作?我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

哦,我现在看到,那么函数是在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);
}