记录--前端中 JS 发起的请求可以暂停吗

这篇具有很好参考价值的文章主要介绍了记录--前端中 JS 发起的请求可以暂停吗。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

记录--前端中 JS 发起的请求可以暂停吗

在前端中,JavaScript(JS)可以使用XMLHttpRequest对象或fetch API来发起网络请求。然而,JavaScript本身并没有提供直接的方法来暂停请求的执行。一旦请求被发送,它会继续执行并等待响应。

尽管如此,你可以通过一些技巧或库来模拟请求的暂停和继续执行。下面是一种常见的方法:

1. 使用XMLHttpRequest对象

你可以在发送请求前创建一个XMLHttpRequest对象,并将其保存在变量中。然后,在需要暂停请求时,调用该对象的abort()方法来中止请求。当需要继续执行请求时,可以重新创建一个新的XMLHttpRequest对象并发起请求。

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/api', true);
xhr.send();

// 暂停请求
xhr.abort();

// 继续请求
xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/api', true);
xhr.send();

2. 使用fetch API和AbortController

fetch API与AbortController一起使用可以更方便地控制请求的暂停和继续执行。AbortController提供了一个abort()方法,可以用于中止fetch请求。

var controller = new AbortController();

fetch('https://example.com/api', { signal: controller.signal })
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

// 暂停请求
controller.abort();

// 继续请求
controller = new AbortController();

fetch('https://example.com/api', { signal: controller.signal })
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

请注意,这些方法实际上是通过中止请求并重新发起新的请求来模拟暂停和继续执行的效果,并不能真正暂停正在进行的请求。

3. 曲线救国

模拟一个假暂停的功能,在前端的业务场景上,需要对这些数据进行处理之后渲染在界面上,如果我们能在请求发起之前增加一个控制器,在请求回来时,如果控制器为暂停状态则不处理数据,等待控制器恢复后再进行处理,也可以达到暂停的效果。

// 创建一个暂停控制器 Promise
function createPauseControllerPromise() {
  const result = {
    isPause: false, // 标记控制器是否处于暂停状态
    resolveWhenResume: false, // 表示在恢复时是否解析 Promise
    resolve(value) {}, // 解析 Promise 的占位函数
    pause() { // 暂停控制器的函数
      this.isPause = true;
    },
    resume() { // 恢复控制器的函数
      if (!this.isPause) return;
      this.isPause = false;
      if (this.resolveWhenResume) {
        this.resolve();
      }
    },
    promise: Promise.resolve(), // 初始为已解决状态的 Promise
  };

  const promise = new Promise((res) => {
    result.resolve = res; // 将解析函数与 Promise 关联
  });
  result.promise = promise; // 更新控制器中的 Promise 对象

  return result; // 返回控制器对象
}

function requestWithPauseControl(request) {
  const controller = createPauseControllerPromise(); // 创建暂停控制器对象

  const controlRequest = request() // 执行请求函数
    .then((data) => { // 请求成功回调
      if (!controller.isPause) controller.resolve(); // 如果控制器未暂停,则解析 Promise
      return data; // 返回请求结果
    })
    .finally(() => {
      controller.resolveWhenResume = true; // 标记在恢复时解析 Promise
    });

  const result = Promise.all([controlRequest, controller.promise]).then(
    (data) => {
      controller.resolve(); // 解析控制器的 Promise
      return data[0]; // 返回请求处理结果
    }
  );

  result.pause = controller.pause.bind(controller); // 将暂停函数绑定到结果 Promise 对象
  result.resume = controller.resume.bind(controller); // 将恢复函数绑定到结果 Promise 对象

  return result; // 返回添加了暂停控制功能的结果 Promise 对象
}

为什么需要创建两个promise

在requestWithPauseControl函数中,需要等待两个Promise对象解析:一个是请求处理的Promise,另一个是控制器的Promise。通过使用Promise.all方法,可以将这两个Promise对象组合成一个新的Promise,该新的Promise会在两个原始Promise都解析后才会解析。这样做的目的是确保在处理请求结果之前,暂停控制器的resolve方法被调用,以便在恢复时解析Promise。

因此,将请求处理的Promise和控制器的Promise放入一个Promise数组,并使用Promise.all等待它们都解析完成,可以确保在两个Promise都解析后再进行下一步操作,以实现预期的功能。

使用

const result = requestWithPauseControl(/*request fn*/).then((data) => {
    console.log(data)
})

if (Math.random() > 0.5) { result.pause() }

setTimeout(() => {
    result.resume()
}, 4000)

本文转载于:

https://juejin.cn/post/7310786521082560562

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 记录--前端中 JS 发起的请求可以暂停吗文章来源地址https://www.toymoban.com/news/detail-750544.html

到了这里,关于记录--前端中 JS 发起的请求可以暂停吗的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot通过前端发起请求,拿到数据库中的数据并生成excel表格,postman请求并下载文件

    springboot版本3.2.0,数据库版本8 mybatisplus版本3.5.4.1 依赖 实体类 实体类中的枚举类型转换,因调用方法后还是不能转换类型所以暂未解决 Controller层 postman测试 Excel表格 获取数据成功

    2024年01月18日
    浏览(30)
  • vue2前端使用axios发起post请求,后端(springboot)拿不到值解决办法

    axios封装-我常用的请求头参数  application/json; charset=utf-8 页面登录请求-post 网络请求正常传入参数 后端代码,查看控制台发现都为null,没取到值。 1.尝试将前端post请求改成get,其他都不用变 发现正常取到值,打印输出正常。前端页面正常跳转。 2.后端设置为post请求,前端a

    2024年02月02日
    浏览(35)
  • 前端向后端发起请求时,报Uncaught (in promise) ReferenceError: ***** is not defined的错

     前端调用后端的接口,显示的Uncaught (in promise) ReferenceError: getGoods is not defined。但是我们在后端中配置了该接口的请求地址的。同时在前端的axios中也进行了相关接口的封装的。 报错的截图:   原因是没有在页面中引入getGoods这个封装好的接口。 解决方法:只需在需要使用的

    2024年02月08日
    浏览(53)
  • 这是一篇ChatGPT写的博客:vue3&js坑——在循环中发起网络请求,返回结果只有最后一次网络请求的数据

    在开发过程中,本想记录遇到的一个bug,自己写完博客之后,突发奇想,请 ChatGPT 帮我写了一篇同样内容的博客。 我需要在循环中发起网络请求,每次循环都把网络请求返回来的数据存入前端数据库RxDB中。我使用forEach方法,来实现: 上述代码是一个3次循环,每次循环都向

    2024年02月03日
    浏览(29)
  • postman可以通的请求,前端通不了(前端添加Content-type,后端收不到请求)

    接口完成之后,自己使用postman测试了一下,没有问题; 可是在和小组前端调试接口的时候,他却说访问不了; 信息如下:(我自己写的一个打印请求信息的拦截器) 发现报错信息是:  Content type \\\'application/x-www-form-urlencoded;charset=UTF-8\\\' not supported 也就是说发送过来的内容格式

    2024年02月04日
    浏览(31)
  • 记录--纯前端也可以实现「用户无感知录屏」

    要在 JavaScript 中实现屏幕录制,可以使用 navigator.mediaDevices.getDisplayMedia() 方法来获取屏幕的媒体流。然后,可使用 MediaRecorder 对象将媒体流录制为视频文件。 但该方法会在浏览器弹出一个授权窗口,让用户选择要分享的内容,这不可实现“无感知”。 如果真正做到无感知,

    2024年02月08日
    浏览(35)
  • js 在浏览器窗口关闭后还可以不中断网络请求

    有个需求,我们需要在用户发送数据过程中,如果用户关闭了网页( 包括整个浏览器关闭 ),不要中断数据传递 目前XMLHttpRequest对象是不支持的 http服务器 为了测试效果我们用nodejs写了个http服务器代码 文件名为httpServer.js如下,执行 node httpServer.js 就可以跑起来,支持get,pos

    2024年02月15日
    浏览(39)
  • 记录--前端实现并发请求限制

    前两天我的新同事告诉我一个困扰着他的问题,就是低代码平台中存在很多模块,这些模块的渲染是由模块自身处理的,简言之就是组件请求了自己的数据,一个两个模块还好,要是一次请求了几十个模块,就会出现请求阻塞的问题,而且模块的请求都特别大。 大量的并发请

    2024年02月08日
    浏览(24)
  • 记录--前端实用小技巧: 自动合并的网络请求

    我们经常会遇到一个场景,比如在一个列表中批量获取用户的信息。   如果我们一次性往后端发送几十条请求是非常愚蠢的事情。此时我们就要学会如何使用批量获取的逻辑。 但是批量获取有一个问题就是,我需要在用户列表项的上层去获取,然后再把结果分发给下层 此时

    2024年02月14日
    浏览(23)
  • uniapp如何发起网络请求

    几种常见的请求方式: 如何在小程序项目中发起网络请求: 小程序官方:不在像我们做vue中用axios发请求,微信官方使用wx.request  官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/network/request/wx.request.html 因为本人习惯采用vue2或者vue3使用promise请求方式,习惯使用async,await语法糖,所

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包