Promise的理解及其方法的使用

Promise本身是异步的,通过其方法的使用达到同步的效果。

Promise是内置函数,有then、all、race等方法

1.Promise的基础理解

PromiseStatus 分为3个
pending 准备状态
resolved 执行resolve的状态
rejected 执行reject的状态

var p=new Promise(function(resolve,reject){ //Promise有一个函数参数,这个函数又有两个回调函数resolve,reject作为参数
  var img=new Image();
     img.src="./img/17.jpg";
     img.onload=function(){
         resolve(img);  //执行成功
     }
     img.onerror=function(){
         reject(img.src+"地址错误");  //执行失败
     }
})
p.then(function(a){       //这个是和上面两个回调函数的参数意义对应的  ,then也是个函数
  console.log(a);//执行resolve执行这个函数
},function(b){
  console.log(b);//执行reject执行这个函数
})
//和上面的一样   catch()相当于是reject()的执行函数
p.then(function(a){
  console.log(a);//执行resolve执行这个函数
}).catch(function(b){
    console.log(b);//执行reject执行这个函数
})

2.Promise中then的连缀写法(通过return来实现)

//这个就是连缀的形式
var  obj={
  a:function(){
      console.log("a");
      return this;
  },
  b:function(){
      console.log("b");
      return this;
  }
}

obj.a().b();
obj.b().a();

//Promise中的then连缀
function getImage(src) {
  return new Promise(function (resolve, reject) {
    var img1 = new Image();
    img1.src = src;
    img1.onload = function () {
      resolve(img1);
    };
  });
}
getImage("./img/3-.jpg").then(function(img){
  arr.push(img);
   return getImage("./img/4-.jpg")
}).then(function(img){
  arr.push(img);
   return getImage("./img/5-.jpg")
}).then(function(img){
  arr.push(img);
   return getImage("./img/6-.jpg")
})

3.Promise中all,race的使用

function getImage(src) {
  return new Promise(function (resolve, reject) {//返回Promise
    var img1 = new Image();
    img1.src = src;
    img1.onload = function () {
      resolve(img1);
    };
  });
}
var arr=[];
for(var i=3;i<80;i++){
  arr.push(getImage("./img/"+i+"-.jpg"));  //arr数组存储的是Promise
} 
Promise.all(arr).then(function(list){ //统一处理所有Promise数组,并且返回一个列表
  list.forEach(item=>{
      console.log(item.src);
  })
})

Promise.race(arr).then(function(img){  //异步列表中谁最先完成就执行谁  只有一个
  console.log(img);
})

4.简写

// resolve的简写
Promise.resolve(1).then(function(a){
  console.log(a);
})

new Promise(function(resolve,reject){
resolve(1);
}).then(function(a){
console.log(a);
})

//reject的简写
Promise.reject(1).catch(function(b){
  console.log(b);
})

new Promise(function(resolve,reject){
  reject(1);
}).catch(function(b){
  console.log(b);
})

5.连续then的情况

 new Promise(function(resolve,reject){
        resolve(1);
     }).then(function(a){  //执行的都是resolve方法
      console.log(a);
     }).then(function(a){ //上面的then没有return,后面的then打印的是undefined
      console.log(a)
     })
//上面的和下面的相同
var p=new Promise(function(resolve,reject){
  resolve(1);
});
p.then(function(a){
   console.log(a);
  //  如果在这里没有return Promise对象就会继续执行下一个then中的内容
  // 下一个then中对应的执行对象仍然是当前promise对象
});
p.then(function(b){
console.log(b)
})

6.代码执行的顺序

//promise对象方法中then和catch方法本身就是异步
//在Promise对象的then和catch中都是异步的,除此之外都是同步
console.log("a");
new Promise(function(resolve,reject){
    console.log("b");
    resolve(1);
    console.log("c");
 }).then(function(a){
    console.log("d");
 }).then(function(){
    console.log("e");
 }) 
 console.log("f");   //  a  b  c  f都是同步的
//a b c f d e    

7.干扰问题

//干扰问题是基于三个状态的,只要状态不是pendding,就不会改变,也可以说是排他性
function getImage(src) {
  return new Promise(function (resolve, reject) {
    var img1 = new Image();
    img1.src = src;
    img1.onload = function () {
      //   只能执行一个,具有排他性
      
      resolve(img1);
      reject(img1.src+"地址错误");
    };
  });
}

如果想要更多的学习资料,加好友10398975,免费送

posted on 2020-08-04 17:58  94Lucky  阅读(203)  评论(0编辑  收藏  举报