promise

作者: keknei | 来源:发表于2017-09-10 20:56 被阅读46次

    不废话,上来就整,先看一下写法,new了个构造函数,传了两个匿名函数参数resolve,reject,分别是成功和失败,需要注意的一点就是new完之后就开始执行,很果断,不带犹豫的,这就是promise的脾气啊

    {
         let p=new Promise((resolve,reject)=>{
              setTimeout(
                  ()=>{
                     console.log('2');
                     resolve('success');
                  },0);
         }).then((res)=>{
                console.log(res+1);
                return 3;
         }).then((res)=>{
               console.log(res);//3
       });
    }
    

    下面来一段img加载的代码,由于promise脾气太过于耿直,so,咱们把他扔到function里,把他return出去,这样就可以随时随用了,再也不用担心promise的脾气了,这段代码里加了一个then,then是什么鸟呢,他是promise上面一个方法,传两个匿名函数,一个成功,一个失败,在promise的resolve里面传的参数就会传到then的成功函数里,同样的reject也是

    {
         function loadImg(url){
              const p=new Promise((resolve,reject)=>{
                    let img=new Image();
                    img.onload=function (){
                        resolve('加载成功');
                        console.log('success');
                    };
                    img.onerror=function (){
                        reject('加载失败');
                        console.log('error');
                    };
                   img.src=url;
                   console.log(url);
              });
              return p;
          }
      
          //加载图片
           loadImg('http://imgsrc.baidu.com/imgad/pic/item/
           267f9e2f07082838b5168c32b299a9014c08f1f9.jpg').then((suc)=>{
              console.log(suc)
              return loadImg('http://imgsrc.baidu.com/');
              //成功
           },(err)=>{
              console.log(err);
              //失败
           }).then(suc=>{
              console.log(suc);
              alert(suc);
           },err=>{
              console.log(err);
              alert(err);
           });
    
           //上面就是resolve方法使用,当然reject也是这种用法,
           then真是犀利的 一B啊
    }
    

    look一下all的用法,感觉这特么的就是个大招啊,异步执行的,并且在所有异步操作执行完后才执行回调,谁拖大腿根听谁的

    {
        function getImg(url){
           const p=new Promise((resolve,reject)=>{
               let img=new Image();
               img.src=url;
               img.onload=function (){
                    resolve('suc');
               };
               img.onerror=function (){
                    reject('err');
               };
           });
           return p;
        }
    
        function hideBanner(flag){
           let p=new Promise((resolve,reject)=>{
              setTimeout(()=>{
                 if (flag){
                     resolve('隐藏成功');
                 }else{
                     reject('失败');
                 }
               },1000);
               console.log('隐藏图片');
           });
           return p;
        }
        Promise.all([getImg('http://imgsrc.baidu.com/imgad/pic/item/
        267f9e2f07082838b5168c
        32b299a9014c08f1f9.jpg'),hideBanner(true)]).then((results)=>{
           console.log(results);//["suc", "隐藏成功"]
        });
        //传的这个URL路径是错误的并不会加载成功,所以会走reject
                    
        Promise.all([getImg('http://imgsrc.baidu.com
        /pic/item/267f9e2f07082838b51
        68c32b8f1f9.jpg'),hideBanner(false)]).then((results)=>{
            console.log(results);
        }).catch(e=>{
            console.log(e);//err
        });
        //promise真是个够义气的哥们啊,要么都成功,要么一个失败,就都失败
    }
    

    再see一下race的方法,这个也是异步的,但是跟all不同的是,谁跑的快听谁的,谁跑到终点就开始执行then了

    {
        function timeout1(){
           let p=new Promise((resolve,reject)=>{
               setTimeout(()=>{
                   resolve('我是1s就执行');
               },1000);
            });
            return p;
        }
    
        function timeout2(){
           let p=new Promise((resolve,relect)=>{
               setTimeout(()=>{
                  console.log('console出来的==》我是2s就执行');
                  resolve('我是2s就执行');
               },2000);
           });
           return p;
        }
    
        Promise.race([timeout1(),timeout2()]).then((results)=>{
            console.log(results);//我是1s就执行
        });
        //很明显,timeout1先执行完,所以then就输出timeout1的成功参数,那么就别以为timeout2就不执行了,其实人家也执行着呢,只不过没有在then里体现出来,那就有人问了,这玩意有个鸟用啊,你还真说对了,这玩意还真有个鸟用,下面看一下请求图片的时候,或者请求借口的时候时间长了如果还没有成功,那就是成功的挂掉了,我们得给用户一个反馈
        function getImg(url){
           const p=new Promise((resolve,reject)=>{
                 let img=new Image();
                 img.src=url;
                 img.onload=function (){
                     resolve('suc');
                 };
                 img.onerror=function (){
                     console.log('gua');
                    //reject('err');
                    //注意这里,因为要在timeout上做失败处理,所以这里就不要执行reject了,因为一旦把状态变为rejected,那么就不会执行timeout了
                 };
           });
           return p;
       }
    
       function timeout(){
           let p=new Promise((resolve,reject)=>{
               setTimeout(()=>{
                   reject('诶哟~挂掉了');
               },5000);
           });
           return p;
       };
       Promise.race([getImg('http://imgsrc.baidu.com/imgad/hehe'),timeout()]).then((result)=>{
          console.log(result);
       }).catch(e=>{
          console.log(e);//诶哟~挂掉了
       });
    }
    

    再来讲一下catch的方法

      //在上面的例子中可以看出,catch是可以顶替reject对应的匿名函数的,那么还有一个作用,是用来顶替try catch的,来看一下下面的例子
    {
         let p=new Promise((resolve,reject)=>{
               reject('error');
               show();//未定义这个show函数
             }).then(res=>console.log(res)).catch(e=>{
                console.log(e);//error
        //下面还可以执行别的代码,如果不用catch的话,js报错就挂掉了,不往下执行了,并且过滤掉了show这个错误
          console.log('继续执行代码');
          });
    }
    
     {
         let p=new Promise((resolve,reject)=>{
                 show();//未定义这个show函数
              }).then(res=>console.log(res)).catch(e=>{
                 console.log(e);//show is not defined
                //下面还可以执行别的代码,如果不用catch的话,js报错就挂掉了,不往下执行了,状态不是reject和resolve的话,不会过滤掉show这个错误
                console.log('继续执行代码');
         });
    }
    
     //在then里报错,还是会进到catch里面,不会影响代码继续执行
    {
       let p=new Promise((resolve,reject)=>{
                resolve('success');
           }).then(res=>{
                console.log(res);
               show();//未定义这个show函数
           }).catch(e=>{
                 console.log(e);//show is not defined
              //下面还可以执行别的代码,如果不用catch的话,js报错就挂掉了,不往下执行了
                console.log('继续执行代码');
     });
    }
    

    关于promise就介绍这么多,希望对你有所帮助,如果想看更详细的资料,请狠狠的点击我

    相关文章

      网友评论

          本文标题:promise

          本文链接:https://www.haomeiwen.com/subject/fcetsxtx.html