简体   繁体   English

无法访问 Javascript 中的对象/数组

[英]Cannot access object/array in Javascript

I can console.log and see the array I created but as soon as I attempt to access it, I get undefined.我可以 console.log 并查看我创建的数组,但是一旦我尝试访问它,我就会得到未定义。

  async componentDidMount() {
    // fetch goal data for display
    let response = await fetchWithToken("http://localhost:8080/api/getGoals");
    let goalData = await response.json();
    goalData = await goalData.filter(skill => skill.Skill === "CS_en");
    // get info from people API with distinct list rather than every row
    let people = new Set([]);
    goalData
      .filter(element => element.UpdatedBy !== null)
      .forEach(element => {
        people.add(element.UpdatedBy);
      });
    people = Array.from(people);
    // call peopleAPI
    const peopleObj = await peopleAPI(people);

    console.log("peopleObj :", peopleObj);
    console.log("peopleObj[0] :", peopleObj[0]);
    }

Here is the peopleAPI where I'm calling another api and getting a list of user info.这是我调用另一个 api 并获取用户信息列表的 peopleAPI。

const peopleAPI = people => {
  return new Promise(function(resolve, reject) {
    // get people API info
    const peopleObj = [];
    const apiPromises = [];
    if (people) {
      people.forEach(empid => {
        const apiPromise = fetch(
          `https://someApiCall/${empid}`
        )
          .then(res => res.json())
          .then(res => {
            peopleObj.push({
              empid: res.id,
              name: res.name.preferred ? res.name.preferred : res.name.full
            });
          })
          .then(() => apiPromises.push(apiPromise));
      });
      // once all promises have been resolved, return a promise with the peopleObj
      Promise.all(apiPromises).then(() => {
        resolve(peopleObj);
      });
    }
  });
};

export default peopleAPI;

Results of console.logs console.logs 的结果

在此处输入图像描述

Don't use push inside fetch.then , just return its value, and then push it to apiPromises`不要在fetch.then中使用 push,只需返回其值,然后将其推送到 apiPromises`

const peopleAPI = people => {`
  return new Promise(function(resolve, reject) {
    // get people API info
    const apiPromises = [];
    if (people) {
      people.forEach(empid => {
        const apiPromise = fetch(`https://someApiCall/${empid}`)
          .then(res => res.json())
          .then(res => {
            return {
              empid: res.id,
              name: res.name.preferred ? res.name.preferred : res.name.full
            }
          });
        apiPromises.push(apiPromise)
      });
      Promise.all(apiPromises).then((data) => {
        resolve(data);
      });
    }
  });
};

export default peopleAPI;

Or even simpler and readable甚至更简单易读

const peopleAPI = people => {`
  const apiPromises = people.map(empid => {
    return fetch(`https://someApiCall/${empid}`)
      .then(res => res.json())
      .then(res => ({
        empid: res.id,
        name: res.name.preferred ? res.name.preferred : res.name.full
     }));
    });
  return Promise.all(apiPromises)
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM