当前位置:网站首页>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
terminatedIn the state of , Will release all resources . in other words , hereAsynchronous threadContext 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 :
边栏推荐
- php短视频源码,点赞时会有大拇指动画飘起
- The sandbox has reached a cooperation with digital Hollywood to accelerate the economic development of creators through human resource development
- 【OpenGL】笔记二十九、抗锯齿(MSAA)
- 如何实现轻松管理1500万员工?
- The Sandbox 和数字好莱坞达成合作,通过人力资源开发加速创作者经济的发展
- Google Earth Engine(GEE)——以MODIS/006/MCD19A2为例批量下载逐天AOD数据逐天的均值、最大值、最小值、标准差、方差统计分析和CSV下载(北京市各区为例)
- Mysql root 账号如何重置密码
- 制作条形码的手机App推荐
- Common open source codeless testing tools
- Why is Dameng data called the "first share" of domestic databases?
猜你喜欢
页面关闭前,如何发送一个可靠请求

Challenges faced by virtual human industry

Introduction and application of bigfilter global transaction anti duplication component

LOGO特训营 第四节 字体设计的重要性

UML diagram memory skills

攻防世界 MISC 高手进阶区 001 normal_png

Logo special training camp section II collocation relationship between words and graphics
Redis sentinel simply looks at the trade-offs between distributed high availability and consistency

Domestic database chaos

LOGO特訓營 第一節 鑒別Logo與Logo設計思路
随机推荐
NFT insider 64: e-commerce giant eBay submitted an NFT related trademark application, and KPMG will invest $30million in Web3 and metauniverse
我在linux里面 通过调用odspcmd 查询数据库信息 怎么静默输出 就是只输出值 不要这个
SPSS安装激活教程(包含网盘链接)
Huawei Nova 10 series released Huawei application market to build a solid application security firewall
现在mysql cdc2.1版本在解析值为0000-00-00 00:00:00的datetime类
繁華落盡、物是人非:個人站長該何去何從
odps 中 对表进行了一次备份,为什么在元数据库查m_table 时,两张表的逻辑大小不一致,但数
How diff are the contents of the same configuration item in different environments?
leetcode 72. Edit distance edit distance (medium)
【愚公系列】2022年7月 Go教学课程 003-IDE的安装和基本使用
[acwing] solution of the 58th weekly match
The table is backed up in ODPs. Why check m in the metabase_ Table, the logical sizes of the two tables are inconsistent, but the number of
Lost in the lock world of MySQL
High school physics: linear motion
The Sandbox 和数字好莱坞达成合作,通过人力资源开发加速创作者经济的发展
Logo special training camp Section IV importance of font design
La prospérité est épuisée, les choses sont bonnes et mauvaises: Où puis - je aller pour un chef de station personnel?
More than 30 institutions jointly launched the digital collection industry initiative. How will it move forward in the future?
Shell script implements application service log warehousing MySQL
业务太忙,真的是没时间搞自动化理由吗?