代码之家  ›  专栏  ›  技术社区  ›  Subhojit

React.js:无法在对象数组内的属性中获取promise结果集

  •  0
  • Subhojit  · 技术社区  · 1 年前

    这个 api response 由诸如 films vehicles url数组和 fetching those ,我正在努力 resultant objects 并试图将其更新回上述属性中。

    使用返回承诺后 Promise.all ,我正在尝试设置 电影 车辆 结果,但我无法获得所需的输出。这是我的 Working Code Link

    如有任何关于这个问题的帮助,我们将不胜感激。

    设置后我收到以下问题 电影 车辆 在响应对象中等待promise后得到结果:

    enter image description here

    在这种情况下,我得到 电影 第一个但是 not with the desired output 其中 films needs to the array of objects ,但是 getting the promise status

    enter image description here

    接下来,我将获得 电影 结果为 pending 车辆 许诺 fulfilled result,而不是上述对象属性中的对象的结果数组。

    如何重新解决这个问题?我的唯一 desired output is to get the films and vehicles array of objects inside the response object which I have kept in the newState

    请在下面找到我的代码:

    import { useEffect, useState } from "react";
    const url = `https://swapi.dev/api/people/`;
    
    export function ToDo() {
      const [results, setResults] = useState([]);
    
      useEffect(() => {
        apiCallHandler(url);
      }, []);
    
      async function asyncAllPromises(arr) {
        const promises = await arr.map(async (item) => {
          const response = await fetch(item, { cache: "no-cache" });
          const json = await response.json();
          return json;
        });
        const response = await Promise.all(promises);
        return response;
      }
    
      const apiCallHandler = async () => {
        try {
          const response = await fetch(url);
          let data = await response.json();
    
          let newState = data.results.map((result) => {
            result.films = asyncAllPromises(result.films).then((data) => data);
            result.vehicles = asyncAllPromises(result.vehicles).then(
              (data) => data
            );
            return result;
          });
    
          setResults(newState);
        } catch (error) {
          console.error("Unable to find data", error);
        }
      };
    
      console.log("results", results);
    
      const table =
        results && results.length ? (
          <table>
            <thead>
              <tr>
                <td>Name</td>
                <td>Mass</td>
              </tr>
            </thead>
            <tbody>
              {results.map((result, index) => {
                return (
                  <tr key={index}>
                    <td>{result.name}</td>
                    <td>{result.mass}</td>
                  </tr>
                );
              })}
            </tbody>
          </table>
        ) : (
          "Loading.."
        );
    
      return <>{table}</>;
    }
    
    2 回复  |  直到 1 年前
        1
  •  2
  •   YesWeDont    1 年前

    你忘记打电话了 await 在第27行和第28行,因此 result.films 作为 Promise 此外 .then(data=>data) 是多余的。

    因此,newState的定义应改为:

    let newState = await Promise.all(data.results.map(async result => {
      result.films = await asyncAllPromises(result.films).then((data) => data);
      result.vehicles = await asyncAllPromises(result.vehicles);
      return result;
    }));
    

    这个 Promise.all() 用于转换 许诺 s由返回 async 将函数映射回一个 许诺 那就是 等候 ed。

    希望这能有所帮助!

        2
  •  1
  •   Robin Thomas    1 年前

    你的问题在于 newState 已计算

    let newState = data.results.map((result) => {
      result.films = asyncAllPromises(result.films).then((data) => data);
      result.vehicles = asyncAllPromises(result.vehicles).then(
        (data) => data
      );
      return result;
    });
    

    自从 asyncAllPromises 正在返回 Promise ,你需要等待。其次, map 将返回 许诺 。你也需要等待。

    您可以通过以下方式解决此问题:

    let newState = await Promise.all(data.results.map(async (result) => {
      result.films = await asyncAllPromises(result.films)
      result.vehicles = await asyncAllPromises(result.vehicles);
      return result;
    }));