【问题标题】:Javascript array has data but length is zero [duplicate]Javascript数组有数据但长度为零[重复]
【发布时间】:2018-04-15 03:56:39
【问题描述】:

编辑:这似乎是一个同步问题,因为我没有正确理解承诺。我假设“.then”等待承诺解决。显然情况并非如此。

我遇到了一个我从未见过的奇怪错误。

我有这段代码,它在 Chrome 控制台中产生以下输出。

显然它是一个数组,它有数据和长度,但是当我打印长度属性时它为零。 (我也不能用 map 遍历它)

我真的很困惑,任何帮助将不胜感激。

const readFile = (file) => (
  new Promise((resolve) => {
    const fr = new FileReader();
    fr.onload = () => {
      resolve(fr.result);
    };
    fr.readAsText(file);
  })
);

const readFiles = (files) => {
  const readFiles = [];
  files.forEach((file) => (readFile(file)).then((data) => readFiles.push({name: file.name, data })));
  return readFiles;
};

const scenes = readFiles(...grabbed from file picker dialog...)
console.log('scenes: ', ui.value.scenes);
console.log('length: ', ui.value.scenes.length);

【问题讨论】:

  • 可能是 ui.value.scenes 在日志语句后更新
  • scenes 是否有可能被异步填充?
  • 这不足以识别问题。请edit 提问并附上minimal reproducible example
  • 请给我们更多代码
  • 你读过[]旁边的小i图标吗?

标签: javascript arrays


【解决方案1】:

您从读取文件返回的是一个承诺,因此您应该像这样读取 then 方法中的已解析值

 readFile().then( (scenes) => {
     console.table(scenes)
 }

您可以在控制台中看到值的原因是,在 Chrome 和 Firefox 中使用 console.log 时,它是对象的实时版本,可能会从以后的代码(来自 promise 解析)中更改。
如果你想及时打印对象的状态,你可以运行console.log(JSON.stringify(obj)) 这是来自MDN的sn-p

请注意,如果您在最新版本的 Chrome 和 Firefox 您在控制台上登录的内容是参考 到对象,这不一定是对象的“价值” 你调用 console.log() 的那一刻,但它是 对象在您单击它的那一刻打开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2021-02-17
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2014-07-25
    相关资源
    最近更新 更多