• 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("一切结束了");

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

  • 相关阅读:
    opencart后台操作--第一节 多语言篇---中文语言包
    Apache mod_rewrite实现HTTP和HTTPS重定向跳转
    js搞定网页的简繁转换
    TP5 首页导航一级和二级分类
    php中is_null,empty,isset,unset 的区别详细介绍
    thinkPHP5 引入模板
    mac Gitblit安装
    springCloud 之 Eureka注册中心高可用配置
    spring cloud config-配置中心
    链路追踪工具Zipkin简单整合
  • 原文地址:https://www.cnblogs.com/huoan/p/js.html
Copyright © 2020-2023  润新知