最近遇到一个很有意思的问题,就是怎么给promise提供一个stop方法,专门用来打断promise的等待状态,使它进入reject状态,也就是进入catch。
我苦思冥想了大半天,也写了大半天的代码,发现无从下手。
无从下手的点是,我不知道在外部怎么使promise直接进入拒绝状态。
然后我去思考stop方法的应用场景。
像之前用promise,一般都是异步操作,然后用await 等异步操作完了,再进入下一步。
用stop方法的话,这意味着异步操作执行了后直接不管,扔在一边,在其他地方达到了某个要求,然后把之前的异步操作给中断了。
我始终说服不了自己,为什么要扩展一个stop方法,promise.race不就可以了吗?
但我总感觉stop这个方法,会很有用。
比如下面的两个例子,我发现了promise.race的短板,也突然发现stop还是有点用处的。
1、请求a和请求b,两个一起请求,请求a先请求到了,就把请求b给中断了。
用promise.race的话,也是两个一起请求,请求a先请求到了,执行了promise.race里的then方法,但请求b所在的promise里的方法还在执行,虽然它没有then和catch接住。
2、请求a和请求b,两个一起请求,请求a先报404了,请求b接着请求到了。
用promise.race的话,也是两个一起请求,请求a先报404了,执行了promise.race里的catch方法,但请求b所在的promise里的方法还在执行,虽然它没有then和catch接住。
然后言归正传,还是想怎么扩展一个stop方法,我几乎是找不到办法去扩展,然后用了下面的这种方法。
function promise2(cb){ this.p = new Promise((resolve,reject)=>{ this.stop = reject; cb(resolve,reject); }); } var p = new promise2((resolve,reject) =>{ setTimeout(()=>{ resolve("哈哈你大爷"); },3000); }); var p2 = p.p.then((data)=>{ console.log(data); }).catch((err) =>{ console.error(err); }) p.stop("一切结束了");
如果你有更好的扩展方式,请留言评论。