Skip to content
On this page

Promise总结

介绍

promise是用来解决异步操作回调地狱问题的,它有三种状态:

  1. pending: 初始状态,既不是成功,也不是失败状态。
  2. resolved: 意味着操作成功完成。
  3. rejected: 意味着操作失败。

基本用法

js
var p=new Promise((resolve,reject)=>{
  var flag=true;
  if(flag){
    return resolve("成功信息")
  }else{
    return reject("失败信息")
  }
})
p.then(
  function(data){
    // 第一个函数接收成功信息,如果promise返回的是resolve则调用此函数
    console.log(data) // "成功信息"
  },
  function(data){
    // 第二个函数接收失败信息,如果promise返回的是reject则调用此函数,此函数可以省略用catch()接收失败信息
    console.log(data)
  }
)

实例方法

then()、catch()、finally()

这里的finally()不是标准方法

js
var p=new Promise((resolve,reject)=>{
  var flag=true;
  if(flag){
    return resolve("成功信息")
  }else{
    return reject("失败信息")
  }
})
p.then((data)=>{
  //成功调用这里
}).catch((data)=>{
  //失败调用这里
}).finally(()=>{
  //不管成功还是失败都会调用这里
})

对象方法

  • Promise.all()

    接收一个Promise对象组成的数组作为参数,当这个数组里的所有Promise对象全部变为resolve的时候,该方法才返回resolve状态结果。但如果数组中有一个Promise对象为reject的话,则直接返回reject状态结果

  • Promise.race()

    使用方法和Promise.all一样,接收一个Promise对象组成的数组为参数。只要其中一个Promise对象变为Resolved或者Rejected状态,该方法直接返回相应状态的结果,进行后面的处理。

js
var p1=new Promise((res,rej)=>{
  setTimeout(()=>{
    res('a');
  },1000)
})
var p2=new Promise((res,rej)=>{
  setTimeout(()=>{
    res('b');
  },150)
})
var p3=new Promise((res,rej)=>{
  setTimeout(()=>{
    res('c');
  },500)
})
var pro1=Promise.all([p1,p2,p3]);
pro1.then(data=>console.log(data)) //["a", "b", "c"]
var pro2=Promise.race([p1,p2,p3]);
pro2.then(data=>console.log(pp)) 
// 这里由于是p2先执行,返回的是resolve,所以结果为:Promise {<resolved>: "b"}