javascript - 如果时间过长,是否停止执行网络请求?
问题描述
我有一些基本上fetch
用 Javascript 调用的代码。第三方服务有时需要很长时间才能返回响应,并且为了更加用户友好,我希望能够在 N 毫秒后发布消息或停止连接打开。
我最近遇到过这篇文章: 如果执行时间太长,请跳过该功能。JavaScript
但是运气不佳,并且在使用以下代码时遇到了问题。我还希望有一种更现代的方法来完成这样的任务,也许使用async/await
?
module.exports = (url, { ...options } = {}) => {
return fetch(url, {
...options
})
}
解决方案
您可以结合使用Promise.race和AbortController,这是一个示例:
function get(url, timeout) {
const controller = new AbortController();
return Promise.race([fetch(url, {
signal: controller.signal
}), new Promise(resolve => {
setTimeout(() => {
resolve("request was not fulfilled in time");
controller.abort();
}, timeout)
})]);
}
(async() => {
const result = await get("https://example.com", 1);
console.log(result);
})();
推荐阅读
- ios - 如何将功能齐全的 iOS 应用连接到新的 Firebase 项目
- matlab - matlab - 物体检测
- python - 返回一个点所连接的点列表(xy 坐标),并对照单独的状态列表进行检查
- python - 是否可以在 tkinter 树视图中创建这样的表格(下图)?
- c++ - 为什么 .JPG 文件被忽略而输出为 .JPEG 文件未找到?因此程序应该寻找 .jpg 而不是 .jpeg
- c++ - C++:在 VisualStudio 中使用 ArUCo-OpenGL-Freeglut 时出现错误 LNK2019
- jsf - 为什么实体 bean 字段(java.util.Date)在更新后会更改值
- python - 将包含多个分隔符的文本文件转换为 CSV
- excel - 在带有 AppleScript 的 Excel 中,如何在不引入整个列的情况下获取列的数值?
- listview - 如何从 ItemTappedEventArgs 获取点击坐标