当前位置: 首页 > news >正文

React Promise 中断

需求:

  • 上传文件,但是后端接口不支持多文件上传,但是一次性发出很多请求的话如果有100个文件那对后端的压力又太大了
  • 在上传的时候还需要有停止上传的按钮

进程:

  • async await 只能做到第一步,但是无法在上传中的时候关闭这个进程,只能先隐藏进程然后等当前进程结束之后在代码下面加一个判定是不是已经关闭
const uploadFile = async () => {isCancel.current = false;for (let i = 0; i < fileList.length; i++) {if (isCancel.current) {return;}const file = fileList[i]const res = await uploadFiles({ file })if (isCancel.current) {break;}}
  • 但是这种做法只有在等 uploadFiles 里所有的东西都结束之后才能判定下一步的isCancel,但是这样会有一个问题,就是如果uploadFiles 执行时间很长,那么要么cancel 的执行时间会很长,要么就提前隐藏上传界面,但是这样有风险,如果用的人在cancel 的时候又点击了一下上传,那么就完了, 这个方法里的isCancel 又会变成 false,然后继续执行
  • 使用传统的 Promise 中的reject 方法可以随时停止这个异步行为
const createCanCancelRequest = (requestFunc: () => Promise<any>) => {let func = () => {}const promise = new Promise((resolve, reject) => {func = () => reject("上传停止");requestFunc().then(resolve).catch(reject)})return { cancel: func, promise }
}
  • 这个方法接收一个传入的匿名函数,然后将匿名函数包裹在 Promise 里,执行并返回一个cancel 方法
  • 这个cancel 就是Promise 的 reject 方法,在调用这个方法之后未执行部分就会停止执行
  • 但是这个方法有个缺点就是要自己手动写一个sleep,在上一步执行完成之前,都不能停止sleep
const uploadFile = async () => {isCancel.current = false;for (let i = 0; i < fileList.length; i++) {if (isCancel.current) {return;}const file = fileList[i]isBreak.current = falseconst {cancel, promise} = createCanCancelRequest(() => {uploadFiles({ file });isBreak.current = true})while(1) {await new Promise(resolve => setTimeout(resolve, 1000));if (isBreak.current) {break}}}

拓展:

  • sleep 的逻辑,启动一个setTimeout 这是一个异步的实现,所以可以用 Promise 包起来并且做一个 await 就能实现暂停几秒的逻辑
http://www.lryc.cn/news/182657.html

相关文章:

  • 1.填空题 进制转换Oct.2023
  • node 解决多版本配置 error:03000086:digital 引起的问题 已解决
  • 前端面试题: js中对比两个对象的值是否相等? for..in 和 for...of的区别?
  • 第十七章:Java连接数据库jdbc(java和myql数据库连接)
  • Unity基于种子与地块概率的开放世界2D地图生成
  • 5.Vectors Transformation Rules
  • 聊聊httpclient的CPool
  • B2主题优化:WordPress文章每次访问随机增加访问量
  • 大模型部署手记(1)ChatGLM2+Windows GPU
  • Rust Rocket: 构建Restful服务项目实战
  • 苹果签名有多少种类之TF签名(TestFlight签名)是什么?优势是什么?什么场合需要应用到?
  • 如何将图片存到数据库(以mysql为例), 使用ORM Bee更加简单
  • 【“栈、队列”的应用】408数据结构代码
  • es的nested查询
  • <一>Qt斗地主游戏开发:开发环境搭建--VS2019+Qt5.15.2
  • python:进度条的使用(tqdm)
  • Java类型转换和类型提升
  • C# 读取 Excel xlsx 文件,显示在 DataGridView 中
  • Docker02基本管理
  • Scala第十章
  • 10.4 校招 实习 内推 面经
  • 从0开始深入理解并发、线程与等待通知机制(中)
  • UE5报错及解决办法
  • 怎么通过docker/portainer部署vue项目
  • 【面试经典150 | 矩阵】旋转图像
  • 机器人制作开源方案 | 家庭清扫拾物机器人
  • C++算法 —— 动态规划(8)01背包问题
  • ASUS华硕天选4笔记本FA507NU7735H_4050原装出厂Win11系统
  • 金蝶OA server_file 目录遍历漏洞
  • read_image错误