【问题标题】:how to wait untill fetch finishes [duplicate]如何等到获取完成[重复]
【发布时间】:2020-08-02 14:45:41
【问题描述】:

我对 javascript 很陌生,我遇到了这个问题。返回部分不会等待我的状态获取。我怎样才能做到这一点?我也尝试添加一些超时,但也没有用。

const LoggedRoute = ({ component: Component, ...rest}) => {
    const token = cookie.get('token');



    fetch(`${constants.urls.put}/auth/user`, {
        method: 'GET',
        headers:{'Authorization': 'Token ' + token}
    })
    .then(
        data => {
            data.json();
            status = data.statusText;
        }
        
    )


    return (
        <Route
        {...rest}
        render={props =>
        ((status != "OK")) ? (
            <Component {...props} />
        ) : (
            <Redirect
            to={{
                pathname: "/",
                state: { from: props.location}
            }}
            /> 
        )
}
/>
);

}
export default LoggedRoute

【问题讨论】:

  • 第一个副本是对您遇到的问题的一般解释。第二种是针对 React 的解决方法。

标签: javascript reactjs authorization frontend fetch


【解决方案1】:

处理这种简单情况的简单方法是在 fetch 运行时返回 &lt;Loader /&gt; 或类似的东西:

if(!fetchFinished) return <Loader />;

return (
// ...your code
);

您还应该将您的 fetch 放入 useEffect 挂钩中,这样您就可以使用 async...await 模式等待您的 fetch 结束:

useEffect(async () => {
  const data = await fetch(...);
  const json = await data.json();
  // etc.

});

return (
  //... your code
);

与您的代码混合的第一个解决方案如下所示:

const LoggedRoute = ({ component: Component, ...rest }) => {
  const token = cookie.get('token');
  // Set a boolean to update when your query is done
  const [isFetchFinished, setIsFetchFinished] = useState(false);

  useEffect(() => {
    fetch(`${constants.urls.put}/auth/user`, {
      method: 'GET',
      headers: { Authorization: 'Token ' + token },
    }).then((data) => {
      data.json();
      status = data.statusText;
      // when you're finished with your data, set your boolean to true
      setIsFetchFinished(true);
    }, []); // Don't forget the empty deps array to make it act like 'componentDidMount'
  });

  if(!isFetchFinished) return <Loader />;

  return (
    <Route
      {...rest}
      render={(props) =>
        status != 'OK' ? (
          <Component {...props} />
        ) : (
          <Redirect
            to={{
              pathname: '/',
              state: { from: props.location },
            }}
          />
        )
      }
    />
  );
};
export default LoggedRoute;

【讨论】:

  • 能否请您在我的代码中显示一下,您的想法是什么?我不确定如何检查您的 if 语句中的提取是否已经完成
  • @plosnak2 我编辑了我的答案,向您展示它的样子。您还应该检查添加的链接以将您的问题标记为“已回答”,这将很有用。
  • 非常感谢!最后一件事,我的程序说 useState 没有定义。我在哪里可以定义这个?如果你能在 DC 上帮我解决这个问题,那就太好了。
  • 还有 useEffect 函数似乎是个问题。它不是一个类是一个问题吗?
  • 当然需要导入,或者像React.useState这样称呼它(useEffect也一样)。这是一个钩子,你应该阅读文档reactjs.org/docs/hooks-intro.html中关于它的章节
猜你喜欢
  • 2016-08-24
  • 2020-01-07
  • 2011-09-23
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多