首页 > 其他分享 >AbortController创建一个可中断的异步任务执行函数---【已解决】

AbortController创建一个可中断的异步任务执行函数---【已解决】

时间:2023-10-11 09:12:06浏览次数:48  
标签:异步 console 中断 signal --- AbortController 任务 error

1、需求背景

使用异步操作(promise)或者多个循环时,遇到不能及时中断操作,回收资源时

2、代码

/**
 * 创建一个可中断的异步任务执行函数。
 * @param {function} taskFunction - 要执行的异步任务函数,接受一个 AbortSignal 参数用于中断。
 * @returns {object} 包含执行任务和中断任务的函数的对象。
 */
function createAbortFunction(taskFunction) {
  let abortController = null; // 用于控制任务的中断
  let signal = null; // 用于传递给任务函数的 AbortSignal

  /**
   * 执行异步任务
   * @param {...any} args - 传递给任务函数的参数
   * @returns {Promise} 异步任务的结果
   */
  async function execute(...args) {
    abortController = new AbortController(); // 创建一个新的 AbortController
    signal = abortController.signal; // 获取与控制器相关的 AbortSignal
    try {
      return await taskFunction(...args, signal); // 执行任务函数并传递 AbortSignal
    } catch (error) {
      if (signal.aborted) {
        const msg = {
          fn: taskFunction,
          ...signal.reason,
        };
        console.log('任务主动中断', msg);
        throw error;
      } else {
        console.error('其他错误处理:', error); // 如果出现其他错误,记录错误信息并抛出错误
        throw error;
      }
    }
  }

  /**
   * 中断当前执行的任务
   */
  function abort(reason = '主动中断') {
    if (abortController) {
      abortController.abort({
        mas: reason,
        type: 'ABORT_ACTION',
      });
    }
  }

  return { execute, abort }; // 返回包含执行任务和中断任务函数的对象
}

2、使用案例

导入
// 导入 createAbortFunction
import { createAbortFunction } from './your-abort-function-module';

// 模拟一个异步任务函数,接受 AbortSignal 并在中断时抛出 AbortError
async function exampleTask(params1, params2, signal) {
  let arr = [];
  for (let i = 0; i < 5; i++) {
    await new Promise(resolve => setTimeout(resolve, 1000));

    // 注意!!!!!必须添加中断标记
    if (signal.aborted) {
      throw signal;
    }
    console.log('params2 -->', params2, 'params1 -->', params1, 'i -->', i);

    arr.push(i);
  }
  return arr;
}

// 使用 createAbortFunction 创建可中断任务执行器
const { execute, abort } = createAbortFunction(exampleTask);

(async () => {
  try {
    console.log('任务开始执行...');
    const result = await execute('aa', 'bb');
    console.log('任务完成:', result);
  } catch (error) {
    console.error('任务失败:', error);
  }
})();

// 在需要中断任务的地方调用
setTimeout(() => {
  // 可传一个中断原因
  abort('用户主动中断');
}, 2500);

3、最终结果

对于业务中长请求或者多个异步请求存在前后关联的场景下,可以有效的控制顺序以及执行过程

标签:异步,console,中断,signal,---,AbortController,任务,error
From: https://www.cnblogs.com/zhengzhijian/p/17756171.html

相关文章

  • 数据分享|MATLAB、R基于Copula方法和k-means聚类的股票选择研究上证A股数据|附代码数
    全文链接:http://tecdat.cn/?p=31733最近我们被客户要求撰写关于Copula的研究报告,包括一些图形和统计输出。Copula方法是测度金融市场间尾部相关性比较有效的方法,而且可用于研究非正态、非线性以及尾部非对称等较复杂的相依特征关系因此,Copula方法开始逐渐代替多元GARCH模型的相......
  • 3_Swagge|sprisma-orm
    HelloWorld生成接口文档SwaggerDocs官方地址访问:/apiprisma=>ORM数据库官方文档csdn:连接mysql安装npminstallprisma--save-devnpxprismainit安装prisma/clien依赖npminstall@prisma/client声明model时,创建数据库npxprismadbpush创建一个srcpr......
  • vsvim config 2023-10-10 23:30:10
    "=Extensions=====================================Plug'tpope/vim-surround'Plug'preservim/nerdtree'"=Basicsettings=====================================setclipboard+=unnamedsetignorecasesetscrolloff=30sethis......
  • spoot-vue学习
    1、创建Vue项目(需要提前搭建好环境)启动cmd,进入到文件夹路径,输入以下命令,回车vueinitwebpackmyvue其中myvue是项目的名称 2、创建完成后,使用IDEA导入此vue项目在控制台中输入npminstall安装依赖环境 安装完成后,输入npminstall--saveaxiosvue-axios安装ax......
  • 04-Shell字符串变量
    1.字符串变量的三种方式字符串(String)就是一系列字符的组合。字符串是Shell编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了)单引号方式双引号方式,推荐不用引号方式var='abc'var2="abc"var3=abc1.1三种格式的区别使用单引号''的字符串:任......
  • 【愚公系列】2023年10月 二十三种设计模式(九)-装饰者模式(Decorator Pattern)
    ......
  • 网络规划设计师真题解析--位示图大小计算
    假设某计算机的字长为32位,该计算机文件管理系统磁盘空间管理采用位示图,记录磁盘的使用情况,若磁盘的容量为300GB,物理块的大小为4MB,那么位示图的大小为(2)个字。(2020年)(2)A.2400 B.3200 C.6400 D.9600答案:A解析:已知磁盘容量为300GB,物理块大小为4MB则计算物理块数=300*1024/4=76800(个)位......
  • 2022-006 在bam中检查指定突变
     转载2022-006在bam中检查指定突变SSSimonYang个人微信公众号SSSimonYang​关注他 2人赞同了该文章需求检查突变在bam文件中存不存在。注意:以下操作均需要bam文件按坐标排序并建立索引。[email protected]_sorted.bam......
  • Django-setting配置不当引起的Session反序列化
    Django-setting配置不当引起的Session反序列化在复现ez_py这道题的时候,翻到了p神19年写的一篇文章:https://www.leavesongs.com/PENETRATION/code-breaking-2018-python-sandbox.html,特此做了下笔记漏洞成因漏洞成因位于目标配置文件settings.py下关于这两个配置项SESSION_EN......
  • 题解 DIFERENC - DIFERENCIJA
    题目描述给出一个长度为\(n\)的序列\(a_i\),求出下列式子的值:\[\sum_{i=1}^n\sum_{j=i}^n(\max\limits_{i\lek\lej}a_k-\min\limits_{i\lek\lej}a_k)\]即定义一个子序列的权值为序列内最大值与最小值的差。求出所有连续子序列的权值和。具体思路暴力思路很好......