Javascript 是否在for循环中正确更新本机密钥?
我的React原生应用程序中有一个函数,我在数组中循环键并从Firebase中提取相应的ref 但是,在我的for循环中,虽然始终计算正确的ref,但是for循环本身中的键值始终为3,因此Javascript 是否在for循环中正确更新本机密钥?,javascript,arrays,for-loop,firebase,react-native,Javascript,Arrays,For Loop,Firebase,React Native,我的React原生应用程序中有一个函数,我在数组中循环键并从Firebase中提取相应的ref 但是,在我的for循环中,虽然始终计算正确的ref,但是for循环本身中的键值始终为3,因此totalItemsCompleted(等于userItemsArray中的键值长度)始终等于3 listenForItems(itemsRef) { var userItemsArray = { 0: [1], 1: [5, 6], 2: [8, 9,
totalItemsCompleted
(等于userItemsArray
中的键值长度)始终等于3
listenForItems(itemsRef) {
var userItemsArray = {
0: [1],
1: [5, 6],
2: [8, 9, 10],
3: [11, 12, 13]
};
var pastItems = [];
var currentItems = [];
for (var key in userItemsArray) {
console.log("KEY1 " + key); //key is correct here
var itemRef = itemsRef.child(key);
itemRef.on('value', (snap) => {
var totalItemsOnList = snap.val().items.length;
var totalItemsCompleted = userItemsArray[key].length;
console.log("KEY2 " + key); //key is always 3 here
if (totalItemsOnList===totalItemsCompleted) {
pastItems.push({
title: snap.val().title,
});
}
else {
currentItems.push({
title: snap.val().title,
});
}
this.setState({
currentItems: this.state.currentItems.cloneWithRows(currentItems),
pastItems: this.state.pastItems.cloneWithRows(pastItems)
});
});
}
}
下一个代码可以轻松复制相同的流程:
for(var i= 0; i< 3; i++) setTimeout(()=> alert(i) ,i * 1000)
另一种可能的方法是将
键
存储为相应HTML元素的属性值下一个代码可以轻松地再现相同的流:
for(var i= 0; i< 3; i++) setTimeout(()=> alert(i) ,i * 1000)
另一种可能的方法是将
键
存储为相应HTML元素的属性值这里的问题是firebase的异步特性。for循环没有等待firebase调用完成,因此它会不断更新键值
除使用key变量外,您还应使用firebase快照的key,如下所示:
var itemRef = itemsRef.child(key);
itemRef.on('value', (snap) => {
var totalItemsOnList = snap.val().items.length;
var totalItemsCompleted = userItemsArray[snap.key()].length;
console.log("KEY2 " + snap.key());
这里的问题是firebase的异步特性。for循环没有等待firebase调用完成,因此它会不断更新键值 除使用key变量外,您还应使用firebase快照的key,如下所示:
var itemRef = itemsRef.child(key);
itemRef.on('value', (snap) => {
var totalItemsOnList = snap.val().items.length;
var totalItemsCompleted = userItemsArray[snap.key()].length;
console.log("KEY2 " + snap.key());
欢迎来到异步编程的奇妙世界。for循环没有等待firebase调用完成,因此它会不断更新键值。你能试着用console.log(snap.name())代替键吗?@AndréKool aha!这是正确的;我现在使用snap.key()并获得正确的值(snap.name()很快就会被弃用)。非常感谢!太好了,我将添加它作为一个答案,这样当其他人也遇到这个问题时,它可以帮助他们。我对名称和键之间的关系产生了怀疑,我刚刚在谷歌搜索中找到了第一个:)欢迎来到异步编程的奇妙世界。for循环没有等待firebase调用完成,因此它会不断更新键值。你能试着用console.log(snap.name())代替键吗?@AndréKool aha!这是正确的;我现在使用snap.key()并获得正确的值(snap.name()很快就会被弃用)。非常感谢!太好了,我将添加它作为一个答案,这样当其他人也遇到这个问题时,它可以帮助他们。我怀疑名字和钥匙之间的关系,于是我在谷歌搜索中找到了第一个:)