loadData()返回空数组

时间:2019-12-08 19:50:57

标签: javascript arrays json promise return

我试图将对象数组返回给函数,然后看着调试器,看起来它只是返回一个空数组。

这是我希望使用的功能:

// 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的房间被推送到我的本地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不太了解。

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

2 个答案:

答案 0 :(得分:1)

问题是您的本地变量室将在异步获取完成之前返回。

您可以简单地等待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);

答案 1 :(得分:0)

尝试一下,如果没有成功,请告诉我。

// 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();