Firestore参考密钥(AutoID)在FOR循环中运行异常

时间:2018-08-08 08:14:16

标签: javascript firebase google-cloud-firestore

这是一个jsfiddle,它重复了问题。我为此使用了测试数据库,所以不用担心数据使用不当。

我的数据是这样的:

slides{
  42rJA379fssKUe11KuCB{
    slideTitle: "Sample Title 4"
  }
  Sp4611QJwQ9GrE2nLauZ{
    slideTitle: "Sample Title 3"
  }
  VfwrwjNFitutSUUzmViE{
    slideTitle: "Sample Title 1"
  }
  W6y1aQKJRxTRV2Jnwd2q{
    slideTitle: "Sample Title 2"
  }
}

我正在使用的代码是这样:

slideArray = ["42rJA379fssKUe11KuCB", "Sp4611QJwQ9GrE2nLauZ", "VfwrwjNFitutSUUzmViE", "W6y1aQKJRxTRV2Jnwd2q"];

for(var i = 0; i < slideArray.length; i++){
  slideKey = slideArray[i];
  console.log('Outside the slide key is:' + slideKey);
  db.collection('slides').doc(slideKey).get().then(function(snap){
    console.log('Inside the slide key is' + slideKey);
    console.log('The slides Title prints correctly however: ' + snap.data().slideTitle);
  })
}

我得到的输出是这样:

Outside the slide key is: Sp4611QJwQ9GrE2nLauZ
Outside the slide key is: VfwrwjNFitutSUUzmViE
Outside the slide key is: W6y1aQKJRxTRV2Jnwd2q
Inside the slide key is W6y1aQKJRxTRV2Jnwd2q
The slides Title prints correctly however: Sample Title 4
Inside the slide key is W6y1aQKJRxTRV2Jnwd2q
The slides Title prints correctly however: Sample Title 3
Inside the slide key is W6y1aQKJRxTRV2Jnwd2q
The slides Title prints correctly however: Sample Title 1
Inside the slide key is W6y1aQKJRxTRV2Jnwd2q
The slides Title prints correctly however: Sample Title 2

我希望它做什么:

因此您可以看到它正在打印正确的样品标题。这意味着它获取每个循环的数据。但是,内部的slideKey始终是数组中的最后一个Key。我希望函数内的slideKey是当前的key。我该如何实现?

还在循环之外,不显示第一个键吗?有人可以解释我在做什么错吗?

1 个答案:

答案 0 :(得分:0)

循环的每次迭代都会生成一个承诺(通过.get()),该承诺会在JavaScript事件循环的后续迭代中被解析和使用(.then(...))。 到那时,您的回调将被调用,slideKey将始终等于循环中的最后一个元素。

您可以使用slideArray.forEach(function(slideKey) {...})轻松修复它。循环的每次调用都会在新的函数范围内发生,因此每次调用都会看到不同的slideKey变量。

如果目标环境足够新,则还可以使用ES5箭头功能,例如:slideArray.forEach(slideKey => { ... })