我刚刚学习了如何使用AbortController API拒绝Promise。它运行良好,但当承诺拒绝作为";child Promise";,即使父Promise被拒绝,这个仍将继续运行。
当父母被拒绝时,有没有办法也阻止孩子?
在本例中,这意味着当您单击取消按钮时,在rejected
日志之后不再有running
日志:
let controller = new AbortController();
new Promise((resolve, reject) => {
setInterval(() => console.log("running"), 500)
controller.signal.addEventListener('abort', () => {
console.log("rejected")
reject();
});
});
function cancel() {
controller.abort();
}
<button onclick="cancel()">Cancel async loop</button>
Promise和abort控制器都很好,需要清除的是您的定时器功能。
当您声明setInterval
时,它会返回一个id,稍后可以引用该id来清除计时器。
所以,当你拒绝承诺时,你需要清除它。
let controller = new AbortController();
new Promise((resolve, reject) => {
const id = setInterval(() => console.log("running"), 500)
controller.signal.addEventListener('abort', () => {
console.log("rejected");
clearInterval(id);
reject();
});
});
function cancel() {
controller.abort();
}
<button onclick="cancel()">Cancel async loop</button>