当前位置:网站首页>页面关闭前,如何发送一个可靠请求
页面关闭前,如何发送一个可靠请求
2022-07-04 22:17:00 【swlws9527】
一、问题
从 A 页面进入到 B 页面前,向后台发送一个/log
请求,如何保证这个请求一定会被接收并处理。
场景复现
function nextPage() {
fetch("/log", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
some: "data",
}),
});
window.location.href = "/other.html";
}
这段代码里,页面切换成功后,后台是接收不到/log
请求的。原因:
- js 的执行可以认为分为
主线程
、异步线程
- 当页面进入
terminated
状态时,会释放所有的资源。也就是说,此时异步线程
中未执行的上下文,不会再被处理。
二、解决方案
2.1 async/await
既然是因为异步导致的请求被执行,那改为同步即可。
async function nextPage() {
await fetch("/log", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
some: "data",
}),
});
window.location.href = "/other.html";
}
这种方式会阻塞代码执行
2.2 keepAlive
fetch
中设置keepalive
为true
时,即使发起请求的页面处于terminated
状态,也会保持连接。利用这哥特性,可以发送可靠的请求。
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
使用 sendBeacon()
方法会使用户代理在有机会时异步地向服务器发送数据,同时不会延迟页面的卸载或影响下一导航的载入性能,这意味着:
- 数据发送是可靠的。
- 数据异步传输。
- 不影响下一导航的载入。
代码示例:
function nextPage() {
navigator.sendBeacon(
"/log",
JSON.stringify({
some: "data",
})
);
window.location.href = "/other.html";
}
sendBeacon()
API 不支持添加请求头,可以利用Blob
做一些改动支持请求头
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";
}
需要注意的是,在Chrome
的network
面板下,它的文档类型为ping
,不是常见的fetch、xhr
类型。
2.4 <a>
标签的 ping 属性
越来越多的厂商支持ping
属性了。示例:
<a href="/other.html" ping="/log">other page</a>
点击a
标签时,会额外发送一个请求/log
,它的请求头中包含几个特殊的值:
{
"ping-from": "http://127.0.0.1:3000/",
"ping-to": "http://127.0.0.1:3000/other.html",
"content-type": "text/ping"
}
三、方案选择
如果出现以下情况,可以使用 fetch()+keepalive:
- 需要自定义请求头。
- 使用 GET 请求,不是 POST 请求。
- 支持较旧的浏览器(如 IE),并且已经加载了 fetch polyfill。
但如果满足以下条件,sendBeacon()可能是更好的选择:
- 进行简单的服务请求,不需要太多定制化。
- 更喜欢更干净、更优雅的 API。
- 希望保证您的请求不会与应用程序中发送的其他高优先级请求竞争。
参考:
边栏推荐
- [the 2023 autumn recruitment of MIHA tour] open [the only exclusive internal push code of school recruitment eytuc]
- High school physics: linear motion
- POM in idea XML dependency cannot be imported
- More than 30 institutions jointly launched the digital collection industry initiative. How will it move forward in the future?
- Domestic database chaos
- 2022-07-04: what is the output of the following go language code? A:true; B:false; C: Compilation error. package main import “fmt“ func main() { fmt.Pri
- 力扣2_1480. 一维数组的动态和
- Ascendex launched Walken (WLKN) - an excellent and leading "walk to earn" game
- 模拟摇杆控制舵机
- Common shortcut keys for hbuilder x
猜你喜欢
达梦数据凭什么被称为国产数据库“第一股”?
Tla+ introductory tutorial (1): introduction to formal methods
Logo Camp d'entraînement section 3 techniques créatives initiales
The sandbox has reached a cooperation with digital Hollywood to accelerate the economic development of creators through human resource development
Deveco device tool 3.0 release brings five capability upgrades to make intelligent device development more efficient
LOGO特训营 第五节 字体结构与设计常用技法
Unity-VScode-Emmylua配置报错解决
【愚公系列】2022年7月 Go教学课程 003-IDE的安装和基本使用
嵌入式开发:技巧和窍门——提高嵌入式软件代码质量的7个技巧
虚拟人产业面临的挑战
随机推荐
Logo Camp d'entraînement section 3 techniques créatives initiales
Éducation à la transmission du savoir | Comment passer à un test logiciel pour l'un des postes les mieux rémunérés sur Internet? (joindre la Feuille de route pour l'apprentissage des tests logiciels)
Deveco device tool 3.0 release brings five capability upgrades to make intelligent device development more efficient
Zhiyang innovation signed a cooperation agreement with Huawei to jointly promote the sustainable development of shengteng AI industry
Naacl-22 | introduce the setting of migration learning on the prompt based text generation task
MySQL存储数据加密
LOGO特训营 第五节 字体结构与设计常用技法
LOGO特训营 第一节 鉴别Logo与Logo设计思路
Shell 脚本实现应用服务日志入库 Mysql
醒悟的日子,我是怎么一步一步走向软件测试的道路
Implementation rules for archiving assessment materials of robot related courses 2022 version
【OpenGL】笔记二十九、抗锯齿(MSAA)
leetcode 72. Edit distance edit distance (medium)
LOGO特训营 第三节 首字母创意手法
Postgresqlql advanced skills pivot table
Common shortcut keys for hbuilder x
传智教育|如何转行互联网高薪岗位之一的软件测试?(附软件测试学习路线图)
Introduction and application of bigfilter global transaction anti duplication component
Scala download and configuration
Locust performance test - environment construction and use