Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组未在javascript函数之外定义?_Javascript_Arrays_Firebase_React Native_Undefined - Fatal编程技术网

数组未在javascript函数之外定义?

数组未在javascript函数之外定义?,javascript,arrays,firebase,react-native,undefined,Javascript,Arrays,Firebase,React Native,Undefined,我在React Native中定义了一个函数,用于从Firebase获取对象并将其内容推送到数组中。然而,尽管在我调用“push”之后数组被很好地填充,但在for循环的末尾它是未定义的。我不知道为什么会被清除,因为我在for循环之外定义数组,所以我想我应该要求额外的一双眼睛,以防我遗漏了什么 var newList = []; var arrayLength = userArray.length; for (var i = 0; i < arrayLength; i

我在React Native中定义了一个函数,用于从Firebase获取对象并将其内容推送到数组中。然而,尽管在我调用“push”之后数组被很好地填充,但在for循环的末尾它是未定义的。我不知道为什么会被清除,因为我在for循环之外定义数组,所以我想我应该要求额外的一双眼睛,以防我遗漏了什么

    var newList = [];
    var arrayLength = userArray.length;
    for (var i = 0; i < arrayLength; i++) {

        var userRef = usersRef.child(userArray[i]);
        userRef.once('value', function(snap) {
            newList.push({
                name: snap.val().name,
                description: snap.val().description,
            });
            //this log statement prints out correct array
            console.log("NEWLIST" + newList[i]);
        });
        //but array is undefined here
        console.log("NEWLIST 2" + newList[i]);
    }
    this.setState({
        current: this.state.current.cloneWithRows(newList),
        past: this.state.past.cloneWithRows(oldList)
    });
var newList=[];
var arrayLength=userArray.length;
对于(变量i=0;i
阅读JavaScript的异步特性。once函数接受回调。外部作用域中的console.log将在您将任何项目推送到数组之前执行。

了解JavaScript的异步特性。once函数接受回调。外部作用域中的console.log在您将任何项推送到阵列之前执行。

代码看起来不错,但我认为这里可能发生的情况是,
userRef.once()
是一个异步调用,您的外部
console.log
首先执行。当事件触发回调时,您的内部
console.log()
打印值

代码看起来不错,但我认为这里可能发生的是
userRef.once()
是一个异步调用,而您的外部
console.log
将首先执行。当事件触发回调时,您的内部
console.log()
会打印值

数组没有被清除,只是当您记录
NEWLIST 2
时它还没有被填充。数据是异步加载的,您的代码(幸运的是用户)没有等待结果。您的日志应该按照它们出现的顺序显示:
NEWLIST 2
,然后才是
NEWLIST
。有关此现象的详细解释,请参阅,当您记录
NEWLIST 2
时,阵列尚未被清除,只是尚未填充。数据是异步加载的,您的代码(幸运的是用户)没有等待结果。您的日志应该按照它们出现的顺序显示:
NEWLIST 2
,然后才是
NEWLIST
。有关此现象的详细解释,请参阅和