【问题标题】:Why does the object (containing an array) passed to second function, give an empty array when I try to access its array?为什么传递给第二个函数的对象(包含一个数组)在我尝试访问它的数组时给出一个空数组?
【发布时间】:2020-07-15 00:08:26
【问题描述】:

我收到了回复数据。我将它传递给另一个函数,然后记录它。我第一次记录整个对象并获得所需的输出,但第二次尝试记录该对象内的数组时,我得到一个空数组。 (我已经交叉检查了数组不为空)。

const f1 = () => {
  window.gapi.load('analytics', async function() {
    window.gapi.analytics.auth.authorize({
      'serverAuth': {
        'access_token': access_token
      }
    });
    const data = await new window.gapi.analytics.ViewSelector({
            container: 'view-selector-container'

    });
    data.execute();
    f2(data);
  });

}

const f2 = async function (data){
  console.log(data);
  console.log(data["zt"]["iH"]);
}

响应1:

      {…}
​
Jd: Object { Lb: false, Zh: 1, Sw: 0, … }
​
Rb: Object { container: "view-selector-container" }
​
TM: Object { Lb: false, gx: false, Va: true, … }
​
hH: Object { Lb: false, gx: false, Va: true, … }
​
ids: "ga:176819049"
​
mP: Object { Lb: false, gx: false, Va: true, … }
​
zt: Object { iH: (9) […], gH: {…}, SM: {…}, … }

响应2:

  []
​
length: 0
​
<prototype>: Array []

console.log 中的数据(data["zt"])

​
zt: {
​​
SM: Object { "UA-xx2": {…}, "UA-xx-1": {…}, "UA-xx-1": {…}, … }
​​
gH: Object { 34199158: {…}, 44335927: {…}, 64056475: {…}, … }
​​
iH: Array(9) [ {…}, {…}, {…}, … ]
​​
r3: Object { 63179797: {…}, 77047380: {…}, 91559901: {…}, … }
​​
<prototype>: Object { fetch: fetch(), … }
​
<prototype>: Object { constructor: RE(a), execute: execute(), gt: gt(), … }
    }

从上面的响应可以看出,iH 是一个长度为 9 的数组,但是当我记录它时,我得到一个空数组

【问题讨论】:

  • 请更新数据的JSON。
  • 你能把console.log(data)的结果贴出来吗?会有很大帮助
  • 您声称但我第二次尝试使用所需的密钥记录它,但引擎不会背叛并说它不存在。不要责怪引擎。怪你的代码。显示@JeremyAnderson 提到的“console.log”,然后您可以从 SO 获得一些帮助。 ....意思是,用console.log(data);的结果更新你的问题。
  • 请添加来自console.log(data['zt'])的数据。这是隐藏的。
  • 您的“response2:”表示它是一个空数组:Array [] 不是undefined,如您的问题所示。我不确定你有没有问题,你有一个空数组。

标签: javascript reactjs async-await


【解决方案1】:

试试这个方法 console.log(data[zt]) console.log(data[iH])

或

console.log(data[zt],data[iH])

【讨论】:

    【解决方案2】:

    这可能是一个异步问题,数据对象只有在您 console.log 之后才会被填充。尝试记录 console.log({...data}) 或 console.log(JSON.stringify(data)) 以确保调用 f2 时数据存在。

    背景:当您使用console.log(data),然后在控制台中查看它时,它会包含即使在console.log 调用之后发生的更改。这是因为数据是一个对象,而您只是记录对对象的引用,而不是对象本身的值。这是一个例子:https://jsfiddle.net/michaschwab/f61tdue5/3/

    【讨论】:

    • 这就是正在发生的事情,如果我在刷新后立即检查 console.log(data) 的输出,它仍然是一个空对象,但是当我在 10 秒后检查它时,它包含值。但是如果我记录数据对象的键,我总是会得到空数组。
    • 在运行 console.log({...data}) 我得到一个空对象
    • 在这种情况下,很明显 data.execute 是异步的,您无需等待结果。您可能必须将 f2 的执行绑定到事件侦听器,例如 data.on('change', function(updated) { console.log(updated); f2(updated); }); 或其他东西。
    • 谷歌分析 api 文档中没有提到 execute() 是一个异步函数,你的建议拯救了我的夜晚
    • 很高兴听到!我看到他们在文档中提到了 data.on 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2021-02-22
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多