【问题标题】:loadData() returning empty arrayloadData() 返回空数组
【发布时间】:2020-04-01 23:47:59
【问题描述】:

我正在尝试将一个对象数组返回给一个函数,并查看调试器,它看起来只是返回一个空数组。

这是我希望使用的功能:

// load from json file
  loadData(filepath) {
    let rooms = [];

    fetch(filepath)
      .then(
        res => res.json()
      )
      .then(function (data) {
        // console.log(data);
        for (let i = 0; i < data.rooms.length; i++) {
          rooms.push(data.rooms[i]);
        }
      });
    return rooms;
  }

我进入调试器,我看到 data.rooms 中的房间被推送到我的本地房间对象,但是当我回到应该使用这个房间数据的 init() 函数时:

let rooms = this.loadData(this.datapath); // TODO: make games load from json data

    for (let i = 0; i < rooms.length; i++) {
      this.addRoom(rooms[i].name, rooms[i].getText, rooms[i].prompts, rooms[i].requirements);
    }

看起来它传递了一个空数组。是否存在范围界定问题或我遗漏了什么?我对 fetch/promises/JSON 不是很有经验。

很高兴提供任何可能有用的进一步信息。谢谢!

【问题讨论】:

  • 您尝试读取的数据是在本地还是通过网络服务器?
  • 您的代码将立即返回房间(最后一行)。您正在使用异步代码。 fetch 函数是异步的。它需要一些时间来完成它的工作。
  • @SarathPS 我正在从网络加载 JSON。我已确认 JSON 已成功加载。
  • @Karlan 谢谢——有没有办法让它等待 for 循环完成?
  • 可以返回fetch函数。然后做 loadData.then() 或者 async/await 更容易。

标签: javascript arrays json promise return


【解决方案1】:

试试这个,如果不起作用,请告诉我。

// load from json file
async function call() {
  const loadData = async filepath => {
    let rooms = [];

    return await fetch(filepath)
      .then(res => res.json())
      .then(async data => {
        rooms = await [...data];
        return rooms;
      });
  };

  let x = await loadData("https://jsonplaceholder.typicode.com/posts");
  console.log("TEST: ", x);
}
call();

【讨论】:

    【解决方案2】:

    问题是您的局部变量 rooms 将在异步获取完成之前返回。

    您可以简单地等待 fetch 语句并使函数异步:

    async loadData(filepath) {
      let rooms = [];
    
      const response = await fetch(filepath);
      const data = await response.json();
    
      console.log(data);
    
      for (let i = 0; i < data.rooms.length; i++) {
          rooms.push(data.rooms[i]);
      }
      return rooms;
    }
    
    let rooms = await this.loadData(this.datapath);
    

    【讨论】:

    • 谢谢,我收到了一个未捕获的 ReferenceError: regeneratorRuntime is not defined。我正在使用browserify来捆绑这个js,这可能是问题吗?
    • 你需要设置你的 browserify 来支持异步等待 -> stackoverflow.com/questions/33527653/…
    • 谢谢...我在全球范围内安装了 browserify。这在尝试安装这些 babel 插件时会有什么不同吗?我没有 package.json、.babelrc 文件等。我需要将它们放在我试图浏览的文件夹中吗? (抱歉,这是我第一次使用这些工具!感谢您的帮助!)
    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 2021-08-11
    • 2017-02-27
    • 2019-04-17
    • 2017-04-24
    • 2019-09-13
    • 2018-02-03
    • 2019-07-05
    相关资源
    最近更新 更多