当前位置:网站首页>页面关闭前,如何发送一个可靠请求
页面关闭前,如何发送一个可靠请求
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。
- 希望保证您的请求不会与应用程序中发送的其他高优先级请求竞争。
参考:
边栏推荐
- Easy to use app recommendation: scan QR code, scan barcode and view history
- Postgresqlql advanced skills pivot table
- SPSS installation and activation tutorial (including network disk link)
- Embedded development: skills and tricks -- seven skills to improve the quality of embedded software code
- 我在linux里面 通过调用odspcmd 查询数据库信息 怎么静默输出 就是只输出值 不要这个
- About stack area, heap area, global area, text constant area and program code area
- Nat. Commun.| Machine learning jointly optimizes the affinity and specificity of mutagenic therapeutic antibodies
- The proofreading activity of data science on the command line second edition was restarted
- Prosperity is exhausted, things are right and people are wrong: where should personal webmasters go
- 卷积神经网络模型之——LeNet网络结构与代码实现
猜你喜欢
都说软件测试很简单有手就行,但为何仍有这么多劝退的?
【愚公系列】2022年7月 Go教学课程 003-IDE的安装和基本使用
Wake up day, how do I step by step towards the road of software testing
SPSS安装激活教程(包含网盘链接)
How to transfer to software testing, one of the high paying jobs in the Internet? (software testing learning roadmap attached)
Enabling digital economy Fuxin software attends the BRICs high level Forum on Sustainable Development
2022-07-04:以下go语言代码输出什么?A:true;B:false;C:编译错误。 package main import “fmt“ func main() { fmt.Pri
LOGO特训营 第五节 字体结构与设计常用技法
国产数据库乱象
Xiangjiang Kunpeng joined the shengteng Wanli partnership program and continued to write a new chapter of cooperation with Huawei
随机推荐
About stack area, heap area, global area, text constant area and program code area
通过Go语言创建CA与签发证书
It is said that software testing is very simple, but why are there so many dissuasions?
业务太忙,真的是没时间搞自动化理由吗?
sobel过滤器
How can the advertising system of large factories be upgraded without the presence of large models
LOGO特训营 第五节 字体结构与设计常用技法
【OpenGL】笔记二十九、抗锯齿(MSAA)
虚拟人产业面临的挑战
leetcode 72. Edit Distance 编辑距离(中等)
Deveco device tool 3.0 release brings five capability upgrades to make intelligent device development more efficient
SQL中MAX与GREATEST的区别
Flask 上下文详解
NFT Insider #64:电商巨头eBay提交NFT相关商标申请,毕马威将在Web3和元宇宙中投入3000万美元
[cooking record] - stir fried 1000 pieces of green pepper
LOGO special training camp section I identification logo and Logo Design Ideas
Kdd2022 | what features are effective for interaction?
TLA+ 入门教程(1):形式化方法简介
力扣2_1480. 一维数组的动态和
9 - 类