Vue学习-Promise的使用

Promise的三种状态

  • pending:等待状态,如果正在进行网络请求,或者定时器没有到时间
  • fulfill:满足状态,当我们主动回调了resolve时,就处于该状态,并且会回调.then()
  • reject:拒绝状态,当我们主动架回调了reject时,就处于该状态,并且会回调.catch()
new Promise((resolve,reject)=>{
     
      //模拟网络请求
      setTimeOut(function(){
           resolve("成功了")
           reject("error message!")
     },1000)

}).then(data=>{
      console.log(data);
}).catch(error=>{
      console.log(error);
})

  • 用一个then(函数1,函数2)的简单写法(没有catch函数),同上面效果一样。函数1是resolve的回调,函数2是reject的回调
new Promise((resolve,reject)=>{
     
      //模拟网络请求
      setTimeOut(function(){
           resolve("成功了")
           reject("error message!")
     },1000)

}).then(data=>{
      console.log(data);
},err=>{
      console.log(err);
})

Promise的链式调用

  • 第1次网络请求的结果,作为第2次网络请求的参数
    第2次网络请求的结果,作为第3次网络请求的参数
new Promise((resolve,reject)=>{
     
      //模拟网络请求
      setTimeOut(function(){
           resolve("第1次成功了")
     },1000)

}).then(data=>{
      console.log(data)
      
      return new Promise((res,rej)=>{
            //发送第2次网络请求
            setTimeOut(function(){
                       resolve("第2次成功了")
               },1000)
      })
}).then(data=>{
      console.log(data)

      return new Promise((res,rej)=>{
            //发送第2次网络请求
            setTimeOut(function(){
                       resolve("第3次成功了")
               },1000)
      })
}).then(data=>{
       console.log(data)
 });
  • 第1层请求后,第2层在第1层的结果上加aaa,第3层在第2层的结果上加bbb
new Promise((resolve,reject)=>{
     
      //模拟网络请求
      setTimeOut(function(){
           resolve("第1次成功了")
     },1000)

}).then(data=>{
      console.log(data)
      
      return new Promise((res,rej)=>{
           resolve(data+"aaaa")
      })
}).then(data=>{
      console.log(data)

      return new Promise((res,rej)=>{
             resolve(data+"bbb")
      })
}).then(data=>{
       console.log(data)
 });
  • 简写Promise.resolve
new Promise((resolve,reject)=>{
     
      //模拟网络请求
      setTimeOut(function(){
           resolve("第1次成功了")
     },1000)

}).then(data=>{
      console.log(data)
      
      return Promise.resolve(data+"aaaa")
}).then(data=>{
      console.log(data)

      return  Promise.resolve(data+"bbb")
}).then(data=>{
       console.log(data)
 });
  • 简写省略掉Promise.resolve,内部会封闭为一个Promise
new Promise((resolve,reject)=>{
     
      //模拟网络请求
      setTimeOut(function(){
           resolve("第1次成功了")
     },1000)

}).then(data=>{
      console.log(data)
      
      return data+"aaaa"
}).then(data=>{
      console.log(data)

      return  data+"bbb"
}).then(data=>{
       console.log(data)
 });
  • 简写Promise.reject或throw,内部会封闭为一个Promise
new Promise((resolve,reject)=>{
     
      //模拟网络请求
      setTimeOut(function(){
           resolve("第1次成功了")
     },1000)

}).then(data=>{
      console.log(data)
      
      //return Promise.reject(data+"error")
      throw data+"error"
}).then(data=>{
      console.log(data)

      return  data+"bbb"
}).then(data=>{
       console.log(data)
 }).catch(err=>{
       console.log(err)
});

Promise.all的使用

  • 需求:2个请求后的结果都满足后,才继续往下执行
    Promise.all的第1个参数是一个Promise数组,里面可以放多个Promise.
    then方法的results也是一个数组,里面存放第个Promise的回调结果
     Promise.all([
      new Promise((resolve,reject)=>{
            $ajax({url:"url1",sucess:function(data){
                        resolve(data)
                  }})
        }),
      new Promise((resolve,reject)=>{
            $ajax({url:"url1",sucess:function(data){
                        resolve(data)
                  }})
        }),

      ]).then(results=>{
             //这里的results也是一个数组,results[0]是放的第1个Promise的结果 ,results[1]是放的第2个Promise的结果    
            console.log(results[0]);
            console.log(results[1]);
       });

猜你喜欢

转载自www.cnblogs.com/bqh10086/p/13183851.html