promise扩展一个stop方法

最近遇到一个很有意思的问题,就是怎么给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("一切结束了");

如果你有更好的扩展方式,请留言评论。

原文地址:https://www.cnblogs.com/huoan/p/js.html