Promise 是异步编程的一种解决方案: 从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。 promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行

主要目的

  • 解决回调地狱
  • 支持多个并发的请求,获取并发请求中的数据
  • 解决异步的问题(但是promise本身不是异步的,它的.then之类的回调函数是异步的)

promise

Es6 新增的引用类型,通过 new 来进行实例化,需要传入一个函数作为其参数

  1. let p = new Promise(()=>{}) // 传入一个参数来当作形参

promise 状态

  • pending:promise 刚创建时的状态,可以通过resolve()(成功的函数)reject()(失败的函数)来将状态进行转变
  • fulfilled:执行resolve()后的状态无法再改变
  • rejected:执行reject()后的状态,也无法改变

当状态改变后当前的 promise 对象就无法再次改变状态
只能通过 return Promise()的方式再返回一个 pending 状态的 promise 对象

.then 的链式操作

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

resolve 和 reject

  • resolve():promise 执行成功调用的函数
  • reject(): 执行失败调用的函数
let p = new Promise((resolve, reject)=>{
    resolve() // 成功执行的函数
  reject() // 失败执行的函数
})

通过自己设置的条件来判断执行哪个函数

.then

.then 有两个参数onresolvedonrejected 两个参数都是可选的,如果不加默认就执行成功的回调

如果想只执行失败 则需要再 onresolved 的位置传入一个 undefined

let p = new Promise()

p.then(()=>{
    // 不添加表名只是成功的回调
})

.catch

.catch 和try{}catch(){}里的.catch 用法一样,用来执行失败的回调

let p = new Promise()

p.then(()=>{
    // 不添加表名只是成功的回调
}).catch(err){
    console.log(err)
}

.all

可以用来合并多个请求,返回一个包含多个请求的数组

let Promise1 = new Promise(function(resolve, reject){})
let Promise2 = new Promise(function(resolve, reject){})
let Promise3 = new Promise(function(resolve, reject){})

let p = Promise.all([Promise1, Promise2, Promise3])

p.then(funciton(){
  // 三个都成功则成功  
}, function(){
  // 只要有失败,则失败 
})

.race

也是多个请求合并,但只有第一个请求回的数据会被返回

let Promise1 = new Promise(function(resolve, reject){})
let Promise2 = new Promise(function(resolve, reject){})
let Promise3 = new Promise(function(resolve, reject){})

let p = Promise.race([Promise1, Promise2, Promise3])

p.then(funciton(){
  // 那个快执行哪个
}, function(){
  // 只要有失败,则失败 
})