当前位置:网站首页>页面关闭前,如何发送一个可靠请求
页面关闭前,如何发送一个可靠请求
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。
- 希望保证您的请求不会与应用程序中发送的其他高优先级请求竞争。
参考:
边栏推荐
- 10 schemes to ensure interface data security
- md5工具类
- 繁华落尽、物是人非:个人站长该何去何从
- Logo special training camp section 1 Identification logo and logo design ideas
- With this PDF, we finally got offers from eight major manufacturers, including Alibaba, bytek and Baidu
- 模拟摇杆控制舵机
- 【lua】int64的支持
- Easy to use app recommendation: scan QR code, scan barcode and view history
- 如何实现轻松管理1500万员工?
- Huawei Nova 10 series released Huawei application market to build a solid application security firewall
猜你喜欢

安装人大金仓数据库

Deveco device tool 3.0 release brings five capability upgrades to make intelligent device development more efficient

É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)

Xiangjiang Kunpeng joined the shengteng Wanli partnership program and continued to write a new chapter of cooperation with Huawei

抖音实战~评论数量同步更新

Energy momentum: how to achieve carbon neutralization in the power industry?

Common open source codeless testing tools
![[acwing] solution of the 58th weekly match](/img/e3/fd2c0ffbc9c7ca8a71875882d6c71b.png)
[acwing] solution of the 58th weekly match

Business is too busy. Is there really no reason to have time for automation?

LOGO特训营 第一节 鉴别Logo与Logo设计思路
随机推荐
PostgreSQL服务端编程聚合和分组
2022-07-04:以下go语言代码输出什么?A:true;B:false;C:编译错误。 package main import “fmt“ func main() { fmt.Pri
如何实现轻松管理1500万员工?
Unity-VScode-Emmylua配置报错解决
Locust性能测试 —— 环境搭建及使用
Scala下载和配置
leetcode 72. Edit distance edit distance (medium)
In Linux, I call odspcmd to query the database information. How to output silently is to only output values. Don't do this
Why is Dameng data called the "first share" of domestic databases?
SPSS installation and activation tutorial (including network disk link)
leetcode 72. Edit distance edit distance (medium)
Convolutional neural network model -- lenet network structure and code implementation
Shell 脚本实现应用服务日志入库 Mysql
都说软件测试很简单有手就行,但为何仍有这么多劝退的?
PostgreSQL server programming aggregation and grouping
More than 30 institutions jointly launched the digital collection industry initiative. How will it move forward in the future?
LOGO特訓營 第三節 首字母創意手法
质量体系建设之路的分分合合
Kdd2022 | what features are effective for interaction?
LOGO特訓營 第一節 鑒別Logo與Logo設計思路