我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何取消正在运行的Promise

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何取消正在运行的Promise

本篇内容介绍了“如何取消正在运行的Promise”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

代码案例

项目当中有很多业务,我们用一些简单代码复现下这个问题。

import React, { useEffect } from 'react';import { history } from 'umi';const Test = props => {  useEffect(() => {    new Promise((resolve, reject) => {        // 模拟接口请求时间        setTimeout(() => {            resolve()        }, 4000);    }).then(res => {        return new Promise((resolve1) => {             // 模拟接口请求时间            setTimeout(() => {                resolve1()            }, 1000);        })    }).then(() => {        // Promise 执行完后页面跳转        history.push('/test1')    })  }, []);  const go = () => {    history.push('/user/login')  }  return (    <div>      <button onClick={go}>go to</button>      Test    </div>  );}export default Test;

我们进入Test组件后,马上点击go to按钮,几秒之后页面还会跳转到test1页面。

经分析,我们应该在离开的时候要取消请求和取消Promise让后续的业务代码不在执行,取消请求比较简单,一般的库都支持,我们来说下怎么取消Promise.

CancelablePromise (取消Promise)

我们知道Promise是没有提供取消或者终止的操作。但我们在开发过程中会遇到。我们可以参考和借助AbortController来实现。

class CancelablePromise<T> {    constructor(executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void, abortSignal: AbortSignal) {    // 记录reject和resolve方法    let _reject: any = null;    let _resolve: any = null;    let _isExecResolve = false;    // 创建和执行Promise    const cancelablePromise = new Promise<T>((resolve, reject) => {      _reject = reject;      _resolve = (value: T) => {        _isExecResolve = true;        resolve(value);      };      return executor(_resolve, reject);    });    // 监听Signal的abourt事件    abortSignal.addEventListener('abort', () => {      if (_isExecResolve) {        return;      }      // 抛出错误      const error = new DOMException('user cancel promise', CancelablePromise.CancelExceptionName );      _reject( error );    } );    return cancelablePromise;  }  // 取消后抛出的异常名称  static CancelExceptionName = 'CancelablePromise AbortError';}export default CancelablePromise;

使用

下面我们该造下之前的代码,用我们封装的CancelablePromise,可以让Promise可取消。

多个Promise链式调用

import React, { useEffect } from 'react';import { history } from 'umi';import CancelablePromise from '../utils/CancelablePromise';const Test = props => {  useEffect(() => {   let abortController = new AbortController();    new CancelablePromise((resolve, reject) => {        // 模拟接口请求时间        setTimeout(() => {            resolve()        }, 4000);    }, abortController.signal).then(res => {        return new CancelablePromise((resolve1) => {             // 模拟接口请求时间            setTimeout(() => {                resolve1()            }, 1000);        }, abortController.signal)    }).then(() => {        // Promise 执行完后页面跳转        history.push('/test1')    })    return () => {        // 取消请求        abortController.abort();    }  }, []);  const go = () => {    history.push('/user/login')  }  return (    <div>      <button onClick={go}>go to</button>      Test    </div>  );}export default Test;

在async和await中使用

import React, { useEffect } from 'react';import { history } from 'umi';import CancelablePromise from '../utils/CancelablePromise';const Test = props => {  useEffect(() => {      let abortController = new AbortController();     const exec = async function () {      try {        await new CancelablePromise((resolve) => {          setTimeout(() => {resolve();}, 5000);        }, abortController.signal, 'one')        await new CancelablePromise((resolve1) => {          setTimeout(() => {resolve1();}, 5000);        }, abortController.signal, 'del')        history.push('/test')      } catch (error) {        // 取消之后会抛出异常        if (CancelablePromise.CancelExceptionName === error.name) {          console.log('promise 终止了。。。')        }      }    }    exec();    return () => {        // 取消请求        abortController.abort();    }  }, []);}

Promise取消之后会抛出异常,如果需要在抛出异常之后做处理,可以通关对应的异常名称做判断。

if (CancelablePromise.CancelExceptionName === error.name) {  console.log('promise 终止了。。。')}

“如何取消正在运行的Promise”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何取消正在运行的Promise

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何取消正在运行的Promise

本篇内容介绍了“如何取消正在运行的Promise”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码案例项目当中有很多业务,我们用一些简单代码
2023-07-02

android如何获取正在运行的应用

可以使用ActivityManager类来获取正在运行的应用。以下是一个示例代码:```javaimport android.app.ActivityManager;import android.content.Context;import
2023-09-26

如何取消正在输入的MySQL命令?

假设如果我们不想执行正在输入的命令,那么我们可以使用clear \c 选项来清除当前输入。例如,可以按如下方式使用 \c 选项 -mysql> Select *-> from\c在上面的例子中,当我们在语句中使用\c时,MySQL会清除当前
2023-10-22

在Android中 获取正在运行的Service 实例

public class ServiceList extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(s
2022-06-06

shell如何查看正在运行的进程

通过使用ps命令可以查看正在运行的进程。下面是一些常用的ps命令选项:ps: 显示当前用户的所有进程。ps -e: 显示系统中所有的进程。ps -aux: 显示所有进程的详细信息,包括进程的用户、PID、CPU使用率、内存使用量等。p
shell如何查看正在运行的进程
2024-04-08

如何停止正在运行的 MySQL 查询

要停止正在运行的 MySQL 查询,可以尝试以下几种方法:1. 使用MySQL命令行工具:在命令行中输入SHOW PROCESSLIST;,可以查看当前正在运行的查询列表。找到要停止的查询的ID(在Id列)然后使用KILL命令停止查询,例如
2023-10-20

linux如何关闭正在运行的程序

在Linux中,可以使用几种不同的方法来关闭正在运行的程序。以下是一些常见的方法:1. 使用Ctrl+C键盘快捷键:如果程序正在终端中运行,可以使用Ctrl+C组合键来发送一个中断信号,强制关闭程序。2. 使用kill命令:可以使用kill
2023-08-25

linux如何关闭正在运行的进程

在Linux中,可以使用kill命令关闭正在运行的进程。kill命令可以向进程发送一个指定的信号,其中最常用的信号是SIGTERM(默认信号)和SIGKILL。1. 查找要关闭的进程的PID(进程ID):可以使用ps命令、top命令或者pg
2023-08-30

linux如何查询正在运行的进程

在Linux系统中,可以使用以下命令来查询正在运行的进程:1. `ps`命令:用于显示当前用户的进程。可以使用`ps aux`命令来显示所有用户的进程。命令的输出包括进程ID(PID)、父进程ID(PPID)、CPU使用率、内存使用量等信息
2023-08-31

如何停止正在运行的 MySQL 查询?

为了停止正在运行的 MySQL 查询,我们可以使用带有进程 ID 的 KILL 命令。语法如下 -kill processId;或者您可以借助以下语法停止正在运行的 MySQL 查询 -call mysql.rds_kill(queryId
2023-10-22

centos如何查看正在运行的进程

要查看正在运行的进程,可以使用以下命令:ps aux这条命令会列出当前系统上所有正在运行的进程,包括它们的进程ID(PID)、所属用户、CPU和内存占用等信息。另外,也可以使用以下命令查看某个特定用户正在运行的进程:ps -u use
centos如何查看正在运行的进程
2024-04-08

ubuntu18.04如何查看正在运行的程序

小编给大家分享一下ubuntu18.04如何查看正在运行的程序,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!方法如下1、首先我们进入ubuntu桌面。2、点击左下
2023-06-13

centos7如何查看正在运行的服务

在CentOS 7上,可以使用以下命令来查看正在运行的服务:1. 使用 `systemctl` 命令来列出所有已启动的服务:```sudo systemctl list-units --type=service --state=runnin
2023-09-15

如何在 Linux 中查看正在运行的进程

在 Linux 中,可以使用以下命令来查看正在运行的进程:1. `top` 命令:可以实时地显示系统的整体运行情况,包括 CPU 使用率、内存使用情况、进程列表等。可以按下 `q` 键退出。2. `ps` 命令:可以列出当前用户的进程。常用
2023-09-21

如何取消Win7启动自动运行程序

每天,公司首先打开电脑。很多用户发现打开电脑很慢。取消启动自动运行程序其实很简单,可能是因为启动的程序太多了。如若不了解如何取消Win7启动时自动运行程序,建议迅速浏览小系列的教程。一、开机自动启动软件困扰大家吗?从下图可以看出,电脑一开机
2023-07-24

如何查看win7正在运行程序

这篇文章主要讲解了“如何查看win7正在运行程序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何查看win7正在运行程序”吧!查看方法:1、首先,咱们在键盘上同时按下win+R,然后在弹出
2023-06-28

Python异步之如何获取当前和正在运行任务

今天小编给大家分享一下Python异步之如何获取当前和正在运行任务的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正文我们可以
2023-07-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录