插件窝 干货文章 页面关闭时SDK接口调用报错:如何避免同步XHR错误?

页面关闭时SDK接口调用报错:如何避免同步XHR错误?

页面 发送 数据 关闭 968    来源:    2025-03-24

在页面关闭时调用SDK接口可能会遇到同步XHR(XMLHttpRequest)错误,因为浏览器在页面关闭时会中断未完成的请求。为了避免这种情况,可以采取以下几种策略:

1. 使用异步XHR

将XHR请求改为异步模式,这样即使页面关闭,请求也不会被中断。异步请求不会阻塞页面关闭,浏览器会在后台继续处理请求。

var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://example.com/api', true); // 第三个参数为true表示异步
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify({ data: 'your data' }));

2. 使用sendBeacon方法

sendBeacon是专门为在页面卸载时发送数据而设计的API。它可以在页面关闭时可靠地发送数据,而不会阻塞页面关闭。

window.addEventListener('unload', function() {
    navigator.sendBeacon('https://example.com/api', JSON.stringify({ data: 'your data' }));
});

3. 使用fetch API

fetch API 默认是异步的,可以在页面关闭时发送请求。虽然它不能保证在页面关闭时一定成功,但通常比同步XHR更可靠。

window.addEventListener('unload', function() {
    fetch('https://example.com/api', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ data: 'your data' })
    });
});

4. 提前发送数据

如果可能的话,尽量在页面关闭之前提前发送数据。例如,可以在用户执行某些操作时(如点击按钮)发送数据,而不是等到页面关闭时才发送。

5. 使用beforeunload事件

beforeunload事件中发送数据,而不是在unload事件中。beforeunload事件在页面关闭之前触发,可以更早地发送数据。

window.addEventListener('beforeunload', function() {
    fetch('https://example.com/api', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ data: 'your data' })
    });
});

6. 使用localStoragesessionStorage

如果数据不是特别敏感或重要,可以先将数据存储在localStoragesessionStorage中,然后在页面重新加载时再发送数据。

window.addEventListener('unload', function() {
    localStorage.setItem('unsentData', JSON.stringify({ data: 'your data' }));
});

// 在页面加载时检查是否有未发送的数据
window.addEventListener('load', function() {
    var unsentData = localStorage.getItem('unsentData');
    if (unsentData) {
        fetch('https://example.com/api', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: unsentData
        });
        localStorage.removeItem('unsentData');
    }
});

总结

为了避免在页面关闭时调用SDK接口报错,建议使用异步请求、sendBeacon方法或提前发送数据。这些方法可以有效地减少同步XHR错误的发生,并提高数据发送的可靠性。