即使它存在,我也无法访问数组内的对象

Enz*_*zio 5 javascript json javascript-objects

此方法将从 firebase 数据库检索到的 JSON 对象存储到数组分数。

function loadScoresToArray(){
    databaseRef.orderByChild("Score").on("child_added", function (snap) {
        scores.push(snap.val());
    });
}
Run Code Online (Sandbox Code Playgroud)

运行上面的方法并打印分数的内容

loadScoresToArray();
console.log(scores);

console.log(scores[0]);
Run Code Online (Sandbox Code Playgroud)

输出

在此处输入图片说明

如此处所见,对象已正确添加到分数中。

但我无法使用索引检索它们。

阅读像类似的问题这个我想这可能是因为当console.log(scores[0]);被调用时,阵列仍然是空的。它尚未被填充。这只是我的猜测。

我该如何解决这个问题?有没有办法在填充数组之前创建延迟?

Mih*_*nut 4

但我无法使用索引检索它们。

那是因为您正在执行异步操作。执行不会等待response,而是立即继续,并执行请求调用之后的语句。

我该如何解决这个问题?有没有办法在数组填充之前创建延迟?

不,不要使用延迟。您可以使用一个callback函数。

function loadScoresToArray(callback){
    databaseRef.orderByChild("Score").on("child_added", function (snap) {
        scores.push(snap.val());
        callback(scores);
    });
}

loadScoresToArray(function(scores){
  console.log(scores[0]);
});
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是使用Promise构造函数来执行异步操作。

function loadScoresToArray(){
    return new Promise(function(resolve, reject){
        databaseRef.orderByChild("Score").on("child_added", function (snap){
           scores.push(snap.val());
           resolve(scores);
        });
    });
}

loadScoresToArray().then(function(scores){
     console.log(scores[0]);
});
Run Code Online (Sandbox Code Playgroud)

以下是解决您的问题的可能方法。

  • 使用 async/await ( ES2017+)进行 Promise
  • 回调
  • 使用 then() 进行承诺( ES2015+)