Javascript 是否在for循环中正确更新本机密钥?

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,

我的React原生应用程序中有一个函数,我在数组中循环键并从Firebase中提取相应的ref

但是,在我的for循环中,虽然始终计算正确的ref,但是for循环本身中的键值始终为3,因此
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()很快就会被弃用)。非常感谢!太好了,我将添加它作为一个答案,这样当其他人也遇到这个问题时,它可以帮助他们。我怀疑名字和钥匙之间的关系,于是我在谷歌搜索中找到了第一个:)