终止Promise的执行

终止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>Document</title>
</head>

<body>
    <button id="btn">abort</button>
    <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();
})

相关推荐

  1. 终止Promise执行

    2024-07-17 17:42:01       20 阅读
  2. 限制promise并行执行个数

    2024-07-17 17:42:01       35 阅读
  3. Promise理解

    2024-07-17 17:42:01       29 阅读
  4. promise

    2024-07-17 17:42:01       55 阅读
  5. Promise

    2024-07-17 17:42:01       49 阅读
  6. Promise

    2024-07-17 17:42:01       37 阅读
  7. <span style='color:red;'>Promise</span>

    Promise

    2024-07-17 17:42:01      32 阅读
  8. Promise

    2024-07-17 17:42:01       16 阅读
  9. ES6中Promise

    2024-07-17 17:42:01       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 17:42:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 17:42:01       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 17:42:01       58 阅读
  4. Python语言-面向对象

    2024-07-17 17:42:01       69 阅读

热门阅读

  1. zookeeper相关总结

    2024-07-17 17:42:01       16 阅读
  2. MySQL5.7社区版本在CentOS7系统上的安装

    2024-07-17 17:42:01       19 阅读
  3. Android 自定义Drawable实现跑马灯效果

    2024-07-17 17:42:01       22 阅读
  4. Dubbo的RPC协议有哪些独特之处

    2024-07-17 17:42:01       19 阅读
  5. vue中缩放比的使用

    2024-07-17 17:42:01       20 阅读
  6. Linux指令&&ros学习&&python深度学习&&bug学习笔记

    2024-07-17 17:42:01       18 阅读
  7. 中文科技核心论文发表

    2024-07-17 17:42:01       19 阅读
  8. MPS 后端

    2024-07-17 17:42:01       23 阅读