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 就能实现暂停几秒的逻辑
相关文章:
React Promise 中断
需求: 上传文件,但是后端接口不支持多文件上传,但是一次性发出很多请求的话如果有100个文件那对后端的压力又太大了在上传的时候还需要有停止上传的按钮 进程: async await 只能做到第一步,但是无法在上传中的时候关…...
1.填空题 进制转换Oct.2023
原题 部分可能会有用处的知识: p p p进制转十进制: 假设有一个 p p p进制数,个位是 a 0 a_0 a0,向高位依次是 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,向低位依次是 b 1 , b 2 , b 3 , . . . …...
node 解决多版本配置 error:03000086:digital 引起的问题 已解决
在日常后端工作中,难免会安装前端的项目,今天有旧项目需要维护,但是 提示 node版本过高,或者不是长维护版本,部分分享说,加 opensll 过滤能解决,但是 还是不行,索性来这个 底朝天的找…...
前端面试题: js中对比两个对象的值是否相等? for..in 和 for...of的区别?
我去面试的时候会问这个问题, 而且发现不管是初级还是工作一段时间的小伙伴 都会说的不是很清晰 比如第一道题哈: 首先大部分人都会想起来 我们用JSON.stringify() 进行转换,查看两个是否相等 你敢说我下面的对象 值不是想等的吗。 但是你用…...
第十七章:Java连接数据库jdbc(java和myql数据库连接)
1.进入命令行:输入cmd,以管理员身份运行 windowsr 2.登录mysql 3.创建库和表 4.使用Java命令查询数据库操作 添加包 导入包的快捷键 选择第四个 找到包的位置 导入成功 创建java项目 二:连接数据库: 第一步:注册驱动…...
Unity基于种子与地块概率的开放世界2D地图生成
public class BuildingGen : MonoBehaviour {public int[] Building;//存储要生成的地块代码public int[] Probability;//存储概率public double seed;public int width 100;public int height 100;public float noiseScale 0.1f; //噪声缩放倍数private int[,] frequencyM…...
5.Vectors Transformation Rules
在上节,有个问题:向量分量的转换方式 与 新旧基底的转换方式相反 用例子来感受一下, 空间中一向量V,即该空间的一个基底:e1、e2 v e1 e2 现把基底 e1 、 e2 放大两倍。变成 基向量放大了两倍, 但对于…...
聊聊httpclient的CPool
序 本文主要研究一下httpclient的CPool ConnPool org/apache/http/pool/ConnPool.java public interface ConnPool<T, E> {/*** Attempts to lease a connection for the given route and with the given* state from the pool.** param route route of the connecti…...
B2主题优化:WordPress文章每次访问随机增加访问量
老站长都知道,一个新站刚开始创建,内容也不多的时候,用户进来看到文章浏览量要么是0,要么是 个位数,非常影响体验,就会有一种“这个网站没人气,看来不行”的感觉。 即使你的内容做的很好&#x…...
大模型部署手记(1)ChatGLM2+Windows GPU
1.简介: 组织机构:智谱/清华 代码仓:https://github.com/THUDM/ChatGLM2-6B 模型:THUDM/chatglm2-6b 下载:https://huggingface.co/THUDM/chatglm2-6b 镜像下载:https://aliendao.cn/models/THUDM/chat…...
Rust Rocket: 构建Restful服务项目实战
前言 这几天我的笔记系统开发工作进入了搬砖期,前端基于Yew,后端基于Rocket。关于Rocket搭建Restful服务,官方也有介绍,感觉很多细节不到位。因此我打算花2到3天的时间来整理一下,也算是对自己的一个交代。 对于有一…...
苹果签名有多少种类之TF签名(TestFlight签名)是什么?优势是什么?什么场合需要应用到?
(一)TestFlight 能够让您:邀请内部和外部的测试人员为应用程序提供反馈。 跟踪应用程序在测试过程中发现的 bug 和用户体验问题。 收集 Crash 报告,了解应用程序在真实设备上的运行状况。 要使用 TestFlight,您可以按照…...
如何将图片存到数据库(以mysql为例), 使用ORM Bee更加简单
如何将图片存到数据库 1. 创建数据库: 2. 生成Javabean public class ImageExam implements Serializable {private static final long serialVersionUID 1596686274309L;private Integer id;private String name; // private Blob image;private InputStream image; //将In…...
【“栈、队列”的应用】408数据结构代码
王道数据结构强化课——【“栈、队列”的应用】代码,持续更新 链式存储栈(单链表实现),并基于上述定义,栈顶在链头,实现“出栈、入栈、判空、判满”四个基本操作 #include <stdio.h> #include <…...
es的nested查询
一、一层嵌套 mapping: PUT /nested_example {"mappings": {"properties": {"name": {"type": "text"},"books": {"type": "nested","properties": {"title": {"t…...
<一>Qt斗地主游戏开发:开发环境搭建--VS2019+Qt5.15.2
1. 开发环境概述 对于Qt的开发环境来说,主流编码IDE界面一般有两种:Qt Creator或VSQt。为了简单起见,这里的操作系统限定为windows,编译器也通用VS了。Qt版本的话自己选择就可以了,当然VS的版本也是依据Qt版本来选定的…...
python:进度条的使用(tqdm)
摘要:为python程序进度条,可以知道程序运行进度。 python中,常用的进度条模块是tqdm,将介绍tqdm的安装和使用 1、安装tqdm: pip install tqdm2、tqdm的使用: (1)在for循环中的使用࿱…...
Java类型转换和类型提升
目录 一、类型转换 1.1 自动类型转换(隐式) 1.1.1 int 与 long 之间 1.1.2 float 与 double 之间 1.1.3 int 与 byte 之间 1.2 强制类型转换(显示) 1.2.1 int 与 long 之间 1.2.2 float 与 double 之间 1.2.3 int 与 d…...
C# 读取 Excel xlsx 文件,显示在 DataGridView 中
编写 read_excel.cs 如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Data; using System.Linq; using System.Text; using System.Data.OleDb;namespace ReadExcel {public partial class Program{static…...
Docker02基本管理
目录 1、Docker 网络 1.1 Docker 网络实现原理 1.2 Docker 的网络模式 1.3 网络模式详解 1.4 资源控制 1.5 进行CPU压力测试 1.6 清理docker占用的磁盘空间 1.7 生产扩展 1、Docker 网络 1.1 Docker 网络实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docke…...
对比直接使用官方API体验Taotoken在稳定性与成本上的差异
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用官方API体验Taotoken在稳定性与成本上的差异 在将大模型能力集成到个人项目或小团队工作流中时,开发者通常…...
开源AI应用构建平台Casibase:从架构设计到生产部署全解析
1. 项目概述:一个开源的AI应用构建平台最近在折腾AI应用开发的朋友,估计都绕不开一个核心痛点:想法很多,但落地太难。从模型选型、API对接、到前端交互、数据管理,每一个环节都够喝一壶。特别是当你想把多个模型、多种…...
从零构建生产级AI助手:OpenClaw配置实战与自动化工作流指南
1. 项目概述:从零到一,构建你的生产级AI助手工作空间如果你和我一样,已经厌倦了每次配置AI助手时,都要从零开始摸索各种配置文件、脚本和最佳实践,那么这个名为openclaw-config的项目,绝对是你梦寐以求的“…...
Taotoken助力初创团队以可控成本集成大模型能力
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken助力初创团队以可控成本集成大模型能力 为产品添加智能对话功能是许多初创团队提升用户体验的关键一步。然而,…...
避坑指南:用MOT17训练YOLOv7检测器时,为什么你的mAP上不去?可能是数据划分的锅
MOT17数据集划分陷阱:为什么你的YOLOv7检测器性能不达标? 当你在MOT17数据集上训练YOLOv7检测器时,是否遇到过这样的困境:损失曲线看起来完美,训练集准确率节节攀升,但验证集mAP却始终徘徊在低水平…...
什么是大模型:概念、分类与当前主流模型全梳理
什么是大模型? 大模型,通常指的是参数规模很大、训练数据很多、具备较强通用能力的人工智能模型。它之所以叫“大”,通常体现在几个方面: 第一,参数量大。 从早期的几千万、几亿参数,发展到几十亿、上百亿&…...
我靠技术博客,从无人问津到拿到硅谷offer
在软件测试这个领域,我们常常自嘲是“质量守门员”,却很少把自己当作技术的创造者与传播者。三年前,我和大多数测试同行一样,每天重复着用例设计、手工执行、提交缺陷的循环,偶尔写点自动化脚本,也仅止于“…...
Done!硅谷分拣快递的人类工作,没了
鹭羽 发自 凹非寺量子位 | 公众号 QbitAI美国具身卷到飞起,明星企业Figure再整新活:这一次,他们让机器人进厂打工,8小时不间断直播放送。目前全网热度爆炸,已经吸引超两百万网友围观。无剪辑、完全现场实录,…...
基于LLM的智能GA4数据分析代理:架构、部署与实战优化
1. 项目概述与核心价值 最近在折腾一个挺有意思的开源项目,叫 Synter-Media-AI/google-analytics-agent 。乍一看名字,你可能觉得这又是一个把Google Analytics数据导出来做可视化的工具,市面上这种工具一抓一大把。但实际深入把玩之后&am…...
不使用void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle)增强代码的层级结构注意事项
这是正常用cube Max生成的代码,这里以设置编码器为例。 GPIO初始化函数放在HAL_TIM_Encoder_MspInit这个回调函数中。代码正常运行/* TIM3 init function */ void MX_TIM3_Init(void) {TIM_Encoder_InitTypeDef sConfig {0};TIM_MasterConfigTypeDef sMasterConfig…...
