1 Promise
Promise
有一个缺点是一旦创建无法取消,所以本质上Promise
是无法被终止的.
但是我们可以通过中断调用链
或中断Promise
来模拟请求的中断.
中断调用链
中断调用链就是在某一个then/catch
执行之后,后续的链式调用(包括then,catch,finally)
不再继续执行.
方法是在then/catch
返回一个新的Promise
实例,并保持pending
状态:
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('result');
});
}).then(res => {
// 达到某种条件,return一个pending状态的Promise实例,以中断调用链
if (res === 'result') {
return new Promise(() => {
});
}
console.log(res); // 不打印
}).then(() => {
console.log('then不执行'); // 不打印
}).catch(() => {
console.log('catch不执行'); // 不打印
}).finally(() => {
console.log('finally不执行'); // 不打印
});
中断Promise
中断Promise
不等同于中止Promise
,因为Promise
是无法被终止的.
这里的中断指的是,在合适的时机,把pending
状态的promise
给reject
掉.例如一个常见的应用场景就是给网络请求设置超时时间,一旦超时就中断.
老规矩,用setTimeout
来模拟网络请求.阀值设置为Math.random() * 3000
表示随机3秒之内返回结果.
const request = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('收到服务端数据')
}, Math.random()