可中断的promise

张开发
2026/4/8 14:51:08 15 分钟阅读

分享文章

可中断的promise
function cancellablePromise(executor) { // TODO: 待补充代码 // 标记是否已取消 let isCancelled false; // 保存 reject 函数供 cancel 使用 let rejectPromise null; // 保存清理函数 let cleanup null; // 创建 Promise const promise new Promise((resolve, reject) { // 保存 reject 函数 rejectPromise reject; // 把 Promise 内部的 reject 赋值给外部的 rejectPromise实现外部控制 Promise 失败 // 包装 resolve取消后不再执行 const safeResolve (value) { if (!isCancelled) { resolve(value); } }; // 包装 reject取消后不再执行除了取消本身的拒绝 const safeReject (reason) { if (!isCancelled) { reject(reason); } }; // 执行 executor捕获清理函数 try { cleanup executor(safeResolve, safeReject); } catch (err) { reject(err); } }); // 取消函数 const cancel (reason 任务被取消) { // 如果已经取消直接返回 if (isCancelled) return; // 标记为已取消 isCancelled true; // 执行清理函数如清除定时器 if (typeof cleanup function) { cleanup(); } // 拒绝 Promise rejectPromise(new Error(reason)); }; // 返回一个对象包含 // 1. promise: 原生 Promise 实例 // 2. cancel: 可调用的取消函数用于中断 Promise return { promise, cancel }; }1.定义函数iscancelledfalse 定义状态如果取消则变为truerejectpromisenull 把promise内部的reject存到外面cancel函数手动失败cleanupnull 接收clearTimeout等2.创建原生promise回调函数3.把 Promise 内部的 reject 赋值给外部的 rejectPromise实现外部控制 Promise 失败4.包装resolve只有没cancel时才是真正的resolve 取消后异步无法resolve5.包装reject同上6.把包装好的 safeResolve 和 safeReject传给用户用户返回的清理函数存到 cleanupcatch 捕获同步代码报错

更多文章