【问题标题】:React Dependent API CallsReact 依赖的 API 调用
【发布时间】:2021-04-08 22:08:49
【问题描述】:

请原谅我的理解不足,假设我的 gists 数组具有以下结构:

{
     "description": 3,
     "id": 123456, 
     "forks_url": "https:api.github.com..."
}

我需要获取用户的 gist 列表,还需要查询要呈现的每个 gist 的分支。我怎样才能使用Promise.all 或任何其他可能有帮助的库进行最少数量的异步 api 调用

我的意思是,我现在可以通过获取gists 并每次查询forks 来使用它,但它会进行很多我想避免的 API 调用。

const GistData = ({ username }) => {
  React.useEffect(() => {
    if (!username) {
      return;
    }
    setState({ status: 'pending' })
    octokit.request(`GET /users/${username}/gists`, username)
      .then(
        gists => {
          setState({ gists: gists.data, status: 'resolved' })
        },
        error => {
          setState({ error, status: 'rejected' })
        }
      );
  }, [username]);

  if (status === 'resolved') {
    return gists.map(
      gist => <GistCard key={gist.id} gist={gist} username={username} />
    )
  } else {
    throw error
  }
}

export default GistData
const GistCard = ({ gist, username }) => {
  React.useEffect(() => {
    if (!id) {
      return;
    }
    setState({ status: 'pending' });
    octokit.request(`GET /gists/${id}/forks`, id).then(
      (forks) => {
        setState({ forks: forks.data, status: 'resolved' });
      },
      (error) => {
        setState({ status: 'rejected', error });
      }
    );
  }, [id]);

 if (status === 'resolved') {
    return (
      <div className="gist">
       <p>{description}</p>}
        <Tags fileList={files} />
        {forks.length > 0 && (
          <div>
            <h3>Forks: ({forks.length})</h3>
            {forks.map((fork) => (
              <Fork key={fork.id} fork={fork} />
            ))}
          </div>
        )}
      </div>
    );
  } else {
    throw error
  }
};

export default GistCard;

【问题讨论】:

    标签: javascript reactjs async-await promise promise.all


    【解决方案1】:

    在我看来,这是一个后端问题。

    在数据来的方式中,前端不可能创建Promise.All,因为您需要初始调用来获取 Gist 列表。在技​​术上获得要点列表后,您可以执行 Promise.All,但与您当前执行的方式相同。

    好吧,我猜您的意思是每次获取要点信息时都进行获取。为此,您可以联系.then

    .then(gists => {
     setState({ gists: gists.data, status: 'resolved' })
        },
        error => {
          setState({ error, status: 'rejected' })
        }
     return gists.data 
     ).then(data => call fetch fork by each gist);
    

    【讨论】:

    • 是的,所以需要一次调用来获取列表,但我的问题是在 forks 调用中,每个要点都会调用一次。我想做的是获得每个要点的分叉,如果可用,然后在我从后端获得分叉后解决承诺。
    猜你喜欢
    • 2020-08-12
    • 2020-05-17
    • 1970-01-01
    • 2020-11-22
    • 2014-06-02
    • 2021-05-22
    • 2019-12-11
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多