typescript 页面重新加载React JS时取消API调用

aiazj4mn  于 2022-12-05  发布在  TypeScript
关注(0)|答案(1)|浏览(198)

我有一个情况,我想记录用户的时间,每当重新加载或关闭一个标签。
我已经写了下面的代码相同。

useEffect(() => {
const cleanup = () => {
deleteAgentLoginDetails(`agentId=${userId.toUpperCase()}`);
agentLogout(`agentId=${userId.toUpperCase()}`);
>     };

window.addEventListener('beforeunload', cleanup);

return () => {
window.removeEventListener('beforeunload', cleanup);
>     };
[]);

我的API调用被触发了,但一旦我重新加载页面,它也被取消了。
有没有替代品来实现这一点?
下面是网络选项卡的屏幕截图。这就是为什么我可以在刷新后看到日志)。
network call screenshot

41ik7eoe

41ik7eoe1#

问题似乎是在刷新页面时浏览器取消了beforeunload事件。这是因为beforeunload事件旨在允许页面在用户离开页面之前提示用户,但在刷新页面时浏览器会自动取消此事件。
此问题的一个可能解决方案是使用unload事件,而不是beforeunload事件。unload事件是不可取消的,因此即使在刷新页面时也应触发该事件。
下面是如何在代码中使用unload事件的示例:

useEffect(() => {
  const cleanup = () => {
    deleteAgentLoginDetails(`agentId=${userId.toUpperCase()}`);
    agentLogout(`agentId=${userId.toUpperCase()}`);
  };

  window.addEventListener('unload', cleanup);

  return () => {
    window.removeEventListener('unload', cleanup);
  };
}, []);

另一种可能的解决方案是使用beforeunload事件,但使用异步函数调用API(例如使用setTimeout),这样浏览器在调用API之前有时间完成卸载过程。这将允许beforeunload事件完成并触发API调用,即使页面正在刷新。
下面是一个示例,说明如何执行此操作:

useEffect(() => {
  const cleanup = () => {
    setTimeout(() => {
      deleteAgentLoginDetails(`agentId=${userId.toUpperCase()}`);
      agentLogout(`agentId=${userId.toUpperCase()}`);
    }, 0);
  };

  window.addEventListener('beforeunload', cleanup);

  return () => {
    window.removeEventListener('beforeunload', cleanup);
  };
}, []);

相关问题