【问题标题】:Send request on unload event在卸载事件上发送请求
【发布时间】:2021-11-04 23:08:18
【问题描述】:

每个人。我得到了一组包含事件信息的对象。例如:

"events": [
    ...,
    {
      "type": "unload",
      "listener": "/idempotency-session/end",
      "method": "post"
    }
  ]

我想根据这个对象的信息创建 eventListener。

const handleEvent = async (api, eventPayload) => {
            const {
                type,
                listener,
                method,
                action,
                headers = {},
                withParams = false,
            } = eventPayload;

            ...

            await callEndpoint(api, listener, method, {}, preparedHeaders)
                .then(data => { 
                    action && stateDispatch({ type: action, payload: data }); 
                })
                .catch(error => console.error(error));
        };

        useEffect(() => {  
            events && events.forEach((event) => {
                const handler = () => {
                    handleEvent(api, event);
                };
                
                window.addEventListener(event.type, handler, event.options);

                return () => {
                    window.removeEventListener(event.type, handler);
                };
            });

          // eslint-disable-next-line react-hooks/exhaustive-deps
          }, []);

问题:卸载事件(当用户关闭页面或导航到另一个页面时)未发送请求。另外,我尝试使用 navigator.sendBeacon 功能,但没有帮助。

【问题讨论】:

    标签: reactjs api react-hooks dom-events use-effect


    【解决方案1】:

    问题是您如何调度您的活动, 如果它们在您的事件运行的同一窗口范围内,您应该创建事件并调度它,

    const event  = new Event("onload",....)
    window.dispatchEvent(event);
    
    
    

    第二件事是你对需要定义 2 个 foreach 的反应生命周期做的有点不对

         useEffect(() => {  
                events && events.forEach((event) => {
                    const handler = () => {
                        handleEvent(api, event);
                    };
                    
                    window.addEventListener(event.type, handler, event.options);
    
                   
                });
    
    
               return () => {
                    events && events.forEach((event) => {
                        const handler = () => {
                            handleEvent(api, event);
                       };
                    
                        window.addEventListener(event.type, handler, event.options);
    
                   
                });
               };
              // eslint-disable-next-line react-hooks/exhaustive-deps
              }, []);
    
    

    当你删除你的监听器时还有其他问题,你应该传递所有参数并且你错过了选项

        window.removeEventListener(event.type, handler , event.options);
    

    【讨论】:

    • 感谢您的第二个和第三个注释。 :) 关于第一个,我的意思是 upload 事件,而不是 onload。我的主要问题是当用户关闭页面或从页面导航时我无法发送请求,即使使用“navigator.sendBeacon”功能也是如此。
    猜你喜欢
    • 2014-10-06
    • 2011-12-06
    • 2014-02-09
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多