我们都知道 Promise 一旦实例化之后,它的状态就只能由 Pending 转变为 Rejected 或者 Fulfilled,而本身是不可以取消已经实例化之后的 Promise 的。那么,如何终止 Promise 的继续执行呢?
使用 Promise.race
Promise.race 方法可以接收多个 Promise,然后返回一个新的 Promise,其状态取决于其中任意一个 Promise。具体来说,如果其中任意一个 Promise resolve 或 reject,就会立即改变状态,而不再等待其他 Promise。
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('p1 resolved');
}, 2000);
});
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('p2 resolved');
}, 1000);
});
Promise.race([p1, p2]).then((result) => {
console.log(result); // 'p2 resolved'
});
在这个例子中,p1 和 p2 都是 Promise,但是由于 p2 的状态更早改变,所以最终会返回 'p2 resolved'。
终止Promise执行
那么,我们如何利用这个特性来实现终止 Promise 执行呢?我们可以创建一个新 Promise,它的状态取决于我们的需要。例如,如果我们想要取消某个 Promise 的继续执行,可以使用 reject 方法改变它的状态,然后让 Promise.race 返回的 Promise 立即改变状态。
const cancelToken = new Promise((resolve, reject) => {
// ...
});
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('p1 resolved');
}, 2000);
});
cancelToken.then(() => {
p1.reject('cancelled');
});
在这个例子中,cancelToken 的状态会影响 p1 的状态。如果 cancelToken resolve,p1 就不会被执行;如果 cancelToken reject,p1 就会立即改变状态。
总结
通过使用 Promise.race 方法,我们可以实现终止Promise的继续执行。这个方法返回一个新的Promise,其状态取决于其中任意一个Promise。我们可以利用这个特性来控制某个Promise是否被执行,这样就可以模拟Promise取消的效果。
本文暂时没有评论,来添加一个吧(●'◡'●)