zoukankan      html  css  js  c++  java
  • 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("一切结束了");

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

  • 相关阅读:
    86. Partition List
    328. Odd Even Linked List
    19. Remove Nth Node From End of List(移除倒数第N的结点, 快慢指针)
    24. Swap Nodes in Pairs
    2. Add Two Numbers(2个链表相加)
    92. Reverse Linked List II(链表部分反转)
    109. Convert Sorted List to Binary Search Tree
    138. Copy List with Random Pointer
    为Unity的新版ugui的Prefab生成预览图
    ArcEngine生成矩形缓冲区
  • 原文地址:https://www.cnblogs.com/huoan/p/js.html
Copyright © 2011-2022 走看看