当前位置:网站首页>页面关闭前,如何发送一个可靠请求
页面关闭前,如何发送一个可靠请求
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。
- 希望保证您的请求不会与应用程序中发送的其他高优先级请求竞争。
参考:
边栏推荐
- 【lua】int64的支持
- Interview essential leetcode linked list algorithm question summary, whole process dry goods!
- Li Kou 98: verify binary search tree
- Unity-VScode-Emmylua配置报错解决
- Solana chain application crema was shut down due to hacker attacks
- 安装人大金仓数据库
- Solana链上应用Crema因黑客攻击停运
- 我在linux里面 通过调用odspcmd 查询数据库信息 怎么静默输出 就是只输出值 不要这个
- Redis sentinel simply looks at the trade-offs between distributed high availability and consistency
- Sqlserver encrypts and decrypts data
猜你喜欢
How to transfer to software testing, one of the high paying jobs in the Internet? (software testing learning roadmap attached)
2022-07-04:以下go语言代码输出什么?A:true;B:false;C:编译错误。 package main import “fmt“ func main() { fmt.Pri
将QA引入软件开发生命周期是工程师要遵循的最佳实践
Unity修仙手游 | lua动态滑动功能(3种源码具体实现)
A large number of virtual anchors in station B were collectively forced to refund: revenue evaporated, but they still owe station B; Jobs was posthumously awarded the U.S. presidential medal of freedo
Radio and television Wuzhou signed a cooperation agreement with Huawei to jointly promote the sustainable development of shengteng AI industry
Huawei Nova 10 series released Huawei application market to build a solid application security firewall
醒悟的日子,我是怎么一步一步走向软件测试的道路
Kdd2022 | what features are effective for interaction?
国产数据库乱象
随机推荐
30余家机构联合发起数字藏品行业倡议,未来会如何前进?
UML diagram memory skills
不同环境相同配置项的内容如何diff差异?
如何实现轻松管理1500万员工?
Huawei Nova 10 series released Huawei application market to build a solid application security firewall
将QA引入软件开发生命周期是工程师要遵循的最佳实践
Naacl-22 | introduce the setting of migration learning on the prompt based text generation task
LOGO特訓營 第三節 首字母創意手法
业务太忙,真的是没时间搞自动化理由吗?
高中物理:直线运动
POM in idea XML dependency cannot be imported
Easy to use app recommendation: scan QR code, scan barcode and view history
Wake up day, how do I step by step towards the road of software testing
NFT insider 64: e-commerce giant eBay submitted an NFT related trademark application, and KPMG will invest $30million in Web3 and metauniverse
Concurrent optimization summary
Deployment of JVM sandbox repeater
Postgresqlql advanced skills pivot table
Common shortcut keys for hbuilder x
[Yugong series] go teaching course 003-ide installation and basic use in July 2022
Li Kou 98: verify binary search tree