注意这里是中断而不是终止,因为 Promise 无法终止,这个中断的意思是:在合适的时候,把 pending 状态的 promise 给 reject 掉。例如一个常见的应用场景就是希望给网络请求设置超时时间,一旦超时就就中断,我们这里用定时器模拟一个网络请求,随机 3 秒之内返回:
const request = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('收到服务端数据');
}, Math.random() * 3000);
});
用户可以手动中断
function abortWrapper(p1) {
let abort;
let p2 = new Promise((resolve, reject) => (abort = reject));
let p = Promise.race([p1, p2]);
p.abort = abort;
return p;
}
const req = abortWrapper(request);
req.then((res) => console.log(res)).catch((e) => console.log(e));
setTimeout(() => req.abort('用户手动终止请求'), 2000); // 这里可以是用户主动点击
最后,再次强调一下,虽然 promise 被中断了,但是 promise 并没有终止,网络请求依然可能返回,只不过那时我们已经不关心请求结果了。