【问题标题】:I can't access object inside array even though it exists [duplicate]即使它存在,我也无法访问数组内的对象[重复]
【发布时间】:2018-01-03 07:28:56
【问题描述】:

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

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

运行上述方法,打印分数内容

loadScoresToArray();
console.log(scores);

console.log(scores[0]);

输出

如此处所示,对象已正确添加到乐谱中。

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

阅读this之类的类似问题我认为这可能是因为当console.log(scores[0]);被调用时,数组仍然是空的。它还没有被填充。这只是我的猜测。

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

【问题讨论】:

  • 您可以访问全球范围内的分数吗?

标签: javascript json javascript-objects


【解决方案1】:

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

那是因为您正在执行异步操作。 执行不会等待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]);
});

另一种解决方案是使用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]);
});

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

  • 异步/等待的承诺 (ES2017+)
  • 回调
  • 与 then() 的承诺 (ES2015+)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    相关资源
    最近更新 更多