
本文旨在解决在使用 Bluebird Promise 实现可取消的异步操作时,async/await 导致的程序卡死问题。我们将探讨如何利用 ES6 内置的 AbortController 来实现 Promise 的取消,并确保程序在取消后能够正常执行后续流程,避免代码阻塞。通过示例代码,我们将展示如何将 AbortController 集成到你的异步函数中,并正确处理取消事件,从而构建更加健壮和可控的异步代码。
在使用 Bluebird 的可取消 Promise 时,结合 async/await 可能会遇到一些问题,尤其是在 Promise 被取消的情况下,程序可能会卡在 await 语句处,导致后续代码无法执行。 这主要是因为取消操作没有正确地通知 await 表达式,使得它一直等待 Promise 的 resolve 或 reject。
解决这个问题的关键在于使用 ES6 内置的 AbortController。AbortController 提供了一种标准的方式来取消异步操作,并且可以与 Promise 结合使用。
使用 AbortController 取消 Promise
以下是一个使用 AbortController 实现可取消 Promise 的示例:
let myP = (signal) =>
new Promise((resolve, reject) => {
const tm = setTimeout(function () {
console.log("before resolve");
resolve("Success!"); // Yay! Everything went well!
}, 2500);
// signal.onabort = () => { // 旧写法,不推荐
signal.addEventListener('abort', () => {
console.log('aborted');
clearTimeout(tm);
reject(new Error('Promise Aborted')); // 建议 reject,方便错误处理
// resolve(); // 也可以 resolve,取决于业务需求
});
});
const run = async () => {
console.log("Start");
const controller = new AbortController();
const signal = controller.signal;
const prm = myP(signal);
setTimeout(() => controller.abort(), 1000);
try {
await prm;
console.log("After await prm");
} catch (e) {
console.error("Caught error:", e);
} finally {
console.log("Finished");
}
};
run();代码解释:
注意事项:
总结
AbortController 提供了一种简洁而强大的方式来取消异步操作,并且可以与 async/await 和 Promise 无缝集成。 通过使用 AbortController,你可以构建更加健壮和可控的异步代码,避免程序卡死,并有效地管理资源。 记得在取消处理函数中清理资源并根据业务需求选择 reject 或 resolve Promise。
以上就是优雅地结合 Async/Await 与可取消的 Bluebird Promise的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号