当前位置:网站首页>How to send a reliable request before closing the page
How to send a reliable request before closing the page
2022-07-04 22:38:00 【swlws9527】
One 、 problem
from A Page goes to B Before page , Send a message to the background /log
request , How to ensure that this request will be received and processed .
Scene: the repetition
function nextPage() {
fetch("/log", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
some: "data",
}),
});
window.location.href = "/other.html";
}
In this code , After successful page switching , The background cannot receive /log
Requested . reason :
- js The implementation of can be divided into
The main thread
、Asynchronous thread
- When the page enters
terminated
In the state of , Will release all resources . in other words , hereAsynchronous thread
Context not executed in , Will no longer be dealt with .
Two 、 Solution
2.1 async/await
Since the request is executed because of asynchrony , Then change to synchronization .
async function nextPage() {
await fetch("/log", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
some: "data",
}),
});
window.location.href = "/other.html";
}
This method will block code execution
2.2 keepAlive
fetch
Set in keepalive
by true
when , Even if the page that initiated the request is terminated
state , Will also remain connected . Use this feature , You can send reliable requests .
function nextPage() {
fetch("/log", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
some: "data",
}),
keepalive: true,
});
window.location.href = "/other.html";
}
2.3 navigator.sendBeacon
Use sendBeacon()
The method allows users to send data asynchronously to the proxy server , At the same time, it will not delay the unloading of the page or affect the loading performance of the next navigation , It means :
- Data transmission is reliable .
- Data asynchronous transmission .
- It does not affect the loading of the next navigation .
Code example :
function nextPage() {
navigator.sendBeacon(
"/log",
JSON.stringify({
some: "data",
})
);
window.location.href = "/other.html";
}
sendBeacon()
API Adding request headers is not supported , You can use Blob
Make some changes to support the request header
function nextPage() {
const blob = new Blob([JSON.stringify({
some: "data" })], {
type: "application/json; charset=UTF-8",
});
navigator.sendBeacon("/log", blob);
window.location.href = "/other.html";
}
It should be noted that , stay Chrome
Of network
Under the panel , Its document type is ping
, It's not common fetch、xhr
type .
2.4 <a>
Labeled ping attribute
More and more manufacturers support ping
The attribute is . Example :
<a href="/other.html" ping="/log">other page</a>
Click on a
When labeling , An additional request will be sent /log
, Its request header contains several special values :
{
"ping-from": "http://127.0.0.1:3000/",
"ping-to": "http://127.0.0.1:3000/other.html",
"content-type": "text/ping"
}
3、 ... and 、 Options
If , have access to fetch()+keepalive:
- You need to customize the request header .
- Use GET request , No POST request .
- Support older browsers ( Such as IE), And it has been loaded fetch polyfill.
But if the following conditions are met ,sendBeacon() Maybe a better choice :
- Make a simple service request , Don't need too much customization .
- Prefer cleaner 、 More elegant API.
- We want to ensure that your request does not compete with other high priority requests sent in the application .
Reference resources :
边栏推荐
猜你喜欢
Redis sentinel simply looks at the trade-offs between distributed high availability and consistency
Locust performance test - environment construction and use
Business is too busy. Is there really no reason to have time for automation?
Kdd2022 | what features are effective for interaction?
Domestic database chaos
Logo special training camp Section IV importance of font design
堆排序代码详解
傳智教育|如何轉行互聯網高薪崗比特之一的軟件測試?(附軟件測試學習路線圖)
Introducing QA into the software development lifecycle is the best practice that engineers should follow
Scala download and configuration
随机推荐
攻防世界 MISC 进阶区 Erik-Baleog-and-Olaf
攻防世界 MISC 進階區 Erik-Baleog-and-Olaf
Introducing QA into the software development lifecycle is the best practice that engineers should follow
Apachecn translation, proofreading, note sorting activity progress announcement 2022.7
PMO: compare the sample efficiency of 25 molecular optimization methods
虚拟人产业面临的挑战
页面关闭前,如何发送一个可靠请求
PostgreSQLSQL高级技巧透视表
Force buckle 2_ 1480. Dynamic sum of one-dimensional array
Energy momentum: how to achieve carbon neutralization in the power industry?
SPSS installation and activation tutorial (including network disk link)
High school physics: linear motion
PHP short video source code, thumb animation will float when you like it
傳智教育|如何轉行互聯網高薪崗比特之一的軟件測試?(附軟件測試學習路線圖)
Mysql root 账号如何重置密码
Naacl-22 | introduce the setting of migration learning on the prompt based text generation task
Postgresqlql advanced skills pivot table
攻防世界 MISC 进阶区 hong
Taobao commodity review API interface (item_review get Taobao commodity review API interface), tmall commodity review API interface
关于栈区、堆区、全局区、文字常量区、程序代码区