我有一个记录API,该API在链接之前执行。链接会将用户重定向到其他地方,我正在执行fetch,然后再重定向用户。所以脚本现在是这样的:
loggingAPI({
timestamp: moment()
})
window.location = "http://.......com"
日志记录api只是普通的提取包装器。
但是,服务器目前未收到API请求。我认为是因为它甚至没有机会将请求发送到api。
所以我可以等待请求发送但不等待响应吗?
答案 0 :(得分:2)
您可以在服务工作者中发送请求。
https://developers.google.com/web/fundamentals/primers/service-workers/
以下是一些特定的信息: https://developer.mozilla.org/en-US/docs/Web/API/FetchEvent
您将注册服务工作者,然后在重定向之前向其发送消息。
最初的复杂性在于,一旦您开始使用服务工作者,他们就会打开一个全新的编程世界。您最终将使用它们更多的内容,然后排队发送消息。
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('service-worker.js').then(function(registration) {
// Registration was successful
console.log('ServiceWorker registration successful with scope: ', registration.scope);
}, function(err) {
// registration failed :(
console.log('ServiceWorker registration failed: ', err);
});
});
}
self.addEventListener('install', function(e) {
return Promise.resolve(null)
});
self.addEventListener('message', function (event) {
console.log('message', event.data)
// call fetch here, catching and responding to what you stashed in the message
});
只是一个演示来模拟您的客户端。
setTimeout(() => {
navigator.serviceWorker.controller.postMessage({message: 'A LOG MESSAGE'});
}, 2000)
将所有部件放好之后,请确保关闭所有标签并重新打开,或者设置了chrome开发工具来处理工作人员的刷新。
答案 1 :(得分:1)
使用sendBeacon非常简单
没有看到适合您的功能的代码loggingAPI
,以下是最佳猜测
注意:
sendBeacon
使用POST请求,因此可能需要修改服务器端以接受这样的请求-尽管看到您的loggingAPI
正在发送数据,我想它已经在使用POST
-因此这可能不是问题
在代码中的某处为Windows设置一个卸载事件
window.addEventListener("unload", () => {
sendBeacon("same url as loggingAPI", JSON.parse({timestamp: moment()}));
}, false);
然后,当您
window.location = "http://.......com"
loggingAPI
函数会为您调用
编辑:对不起,我没有充分充实代码,错过了几步!!