介绍

Promise对象,用来处理异步操作的,可以让异步调用的时候更加美观便理解。

可以解决的问题

1、回调地狱:

在一个异步请求内部继续使用异步操作,嵌套的异步操作需要等待上层的异步操作完成,会陷入不断的嵌套导致程序乱套。
如下代码:

$.ajax({
  url:'https://www.lxtian.com/xxx',
  type:'get',
  success:res=>{
    $.ajax({
      url:'https://www.lxtian.com/xxx',
      type:'get',
      success:res=>{
        //...
        //...
      }
    })
  }
})

2、异步数据的关联问题

如某个异步操作需要使用到另外一个异步的数据,那么使用原始的方法,会导致数据错乱,处理上更复杂。
为了解决上述的问题,这个时候就可以用到Promise。
Promise有三种状态:pending(进行中),resolved(成功执行),rejected(失败执行)。

resolved状态
这个过程我们叫做resolve,即已处理,决定执行这个过程后,后续处理的方式为then()。 可以直接理解为“然后”的意思

rejected状态
这个过程我们叫做reject,即已拒绝,当决定执行这个过程后,后续处理的方式为catch()。 特别注意的是,如果不写catch()并且执行了这个过程,会在控制台报错误,并且会中断之后的操作

基本用法

demo描述:小明和朋友打赌,以硬币正反面决胜负

function xiaoming(){
  return new Promise((resolve,reject)=>{
    //假设0为硬币掉了,1为正面,2为反面
    let num=Math.floor(Math.random()*3);
    if(num==1){
      resolve(true);
    }else if(num==2){
      resolve(false)
    }else{
      reject('手滑了,硬币掉了')
    }
  })
}
xiaoming().then(result=>{
  //假设0为硬币掉了,1为正面,2为反面
  if(result==true){
    console.log('恭喜小明赢啦!')
  }else{
    console.log('很遗憾小明输了...')
  }
}).catch(error=>{
  console.log(error);
});

链式调用

即:按顺序执行,执行完毕才会向下执行,如下

function A() {
    return new Promise((resolve,reject) => {
        let a="a";
        if(a=="a"){
            console.log("我是"+a);
            resolve();
        }else{
            reject("a出错了");
        }
    });
}

function B(){
    return new Promise((resolve,reject)=>{
        let b="b";
        if(b=="b"){
            console.log("我是"+b);
            resolve();
        }else{
            reject("b出错了");
        }
    });
}

function C(){
    return new Promise((resolve,reject)=>{
        let c="c";
        if(c=="c"){
            console.log("我是"+c);
            resolve();
        }else{
            reject("c出错了");
        }
    });
}
A().then(B).then(C);

上述代码我创建了3个构造函数,按照顺序a、b、c顺序执行
控制台输出为:
Promise1.jpg

Promise.all()

Promise.all()可以让多个函数同时执行,而不是和then那样执行一个才会继续下一个。
参数为一个数组,数组内放置不同的函数名
语法:

Promise.all([fun1,fun2,fun3]);

demo:三名同学跑步,同时起步

function fun1() {
  return new Promise((resolve, reject) => {
    setTimeout(function () {
      console.log('f1跑完了')
    }, 1000)
  })
}
function fun2() {
  return new Promise((resolve, reject) => {
    setTimeout(function () {
      console.log('f2跑完了')
    }, 1500)
  })
}
function fun3() {
  return new Promise((resolve, reject) => {
    setTimeout(function () {
      console.log('f3跑完了')
    }, 2000)
  })
}
Promise.all([fun1(), fun2(), fun3()])

以上是个人对Promise简单理解及用法、记录便于复习知识。