码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 终止Promise的执行


    文章目录

    • 终止Promise的执行
      • 1. HTML部分
      • 2. JavaScript部分
        • 1. Promise.race()
        • 2. Promise.withResolvers()
        • 3. AbortController类

    终止Promise的执行

    1. HTML部分

    DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Documenttitle>
    head>
    
    <body>
        <button id="btn">abortbutton>
        <script>
        	// 下文中的js代码放到这里
        script>
    body>
    
    html>
    

    2. JavaScript部分

    1. Promise.race()

    let abort = null;
    let p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log("p1");
            resolve('p1');
        }, 3 * 1000)
    })
    
    let p2 = new Promise((resolve, reject) => {
        abort = reject;
        setTimeout(() => {
            console.log('p2');
            resolve('p2')
        }, 10 * 1000)
    })
    
    Promise.race([p1, p2]).then(res => {
        console.log(res)
    }).catch((err) => {
        console.log(err, 'abort')
    })
    
    btn.addEventListener('click', () => {
        abort('abort')
    })
    

    2. Promise.withResolvers()

    // 模拟异步任务
    const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
    
    const controlPromise = (asyncFn) => {
        let rejected = false;
        let { promise, resolve, reject } = Promise.withResolvers();
    
        return {
            abort: () => {
                rejected = true;
                reject(new Error('Task abort'));
            },
            start: () => {
                if (!rejected) {
                    asyncFn().then(resolve, reject);
                };
                return promise;
            }
        }
    }
    
    const task = controlPromise(async () => {
        await sleep(10 * 1000);
        return 'task done';
    });
    task.start().then(console.log, console.error);
    
    btn.addEventListener('click', () => {
        task.abort();
    })
    
    

    3. AbortController类

    // 模拟异步任务
    const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
    
    const controlPromise = (asyncFn) => {
        const abortController = new AbortController();
        const signal = abortController.signal;
        return {
            abort: () => abortController.abort(),
            start: () => {
                return new Promise((resolve, reject) => {
                    const cancel = () => reject(new Error('Task abort'));
                    if (signal.aborted) {
                        cancel();
                        return;
                    }
                    asyncFn().then(resolve, reject);
                    signal.addEventListener('abort', cancel);
                })
            }
        }
    }
    const task = controlPromise(async () => {
        await sleep(10 * 1000);
        return 'task done';
    });
    task.start().then(console.log, console.error);
    
    btn.addEventListener('click', () => {
        task.abort();
    })
    
  • 相关阅读:
    R语言根据日历周期处理时间序列数据(周、月、年等):使用xts包的apply.monthly函数和mean函数计算时间序列的月平均值(monthly)
    队列的链表实现 题目(难度1/10)
    【Web开发】基于 Jekyll 中的 Chirpy 模板搭建博客网站(一):成功经验篇
    Vue-组件&&单文件组件&&组件的属性&&属性传值&&CSS局部样式
    webpack核心模块
    大端、小端模式
    Redis布隆过滤器和布谷鸟过滤器
    c++复习——名字粉碎
    yarn集群NodeManager日志聚合慢问题解决方案
    ssm823基于ssm的心理预约咨询管理系统的设计与实现+vue
  • 原文地址:https://blog.csdn.net/weixin_45356397/article/details/140464486
  • 最新文章
  • C# 内存安全性的重大演进:重新定义 unsafe 关键字
    [MAF的Agent管道详解-05]对话历史的持久化和输入输出的增强
    一行代码干翻 Java 反射?EggG 流式反射调用让反射优雅到不可思议
    vibe coding(二)Where you go:一个微型 windows 桌面覆盖工具
    [送码] 用 AI Coding 做了一个 App,谈谈 AI Coding 的真实体验
    面试官:说一下 Agent 的常见范式,如何选型?
    CAD子系统,是自研还是外包?
    polygon出题教程
    Manim物理模拟:别自己写欧拉了!
    AI 学习笔记:Agent 的应用演示
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号