这是一个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。我该如何实现?
还在循环之外,不显示第一个键吗?有人可以解释我在做什么错吗?
答案 0 :(得分:0)
循环的每次迭代都会生成一个承诺(通过.get()
),该承诺会在JavaScript事件循环的后续迭代中被解析和使用(.then(...)
)。
到那时,您的回调将被调用,slideKey
将始终等于循环中的最后一个元素。
您可以使用slideArray.forEach(function(slideKey) {...})
轻松修复它。循环的每次调用都会在新的函数范围内发生,因此每次调用都会看到不同的slideKey
变量。
如果目标环境足够新,则还可以使用ES5箭头功能,例如:slideArray.forEach(slideKey => { ... })
。