es6之promise

163 阅读2分钟

1、Promise为何而生?

一幅回调地狱的图片足以解释

2、Promise是什么?

  • Promise对象是一个构造函数,用来生成Promise实例
  • Promise有三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败),至于是哪一种由异步操作结果决定

3、Promise的基本用法

  • Promise的构造函数接收一个函数作为参数,并且这个函数需要传入两个参数:
    • resolve :异步操作执行成功后的回调函数
    • reject:异步操作执行失败后的回调函数
  • then方法接受两个函数作为参数,第一个函数是用来处理resolve的结果,第二个是可选的,用来处理reject的结果。
  • catch函数用来捕获整个then函数链中的异常
  • finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。
let p = new Promise((resolve, reject) => {
    setTimeout(() => {
        Math.random()*10 > 5 ? resolve('success') : reject('fail');
    }, 2000)
})

p.then((data) => {    //
    console.log(data)   //success
}, (err) => {
    console.log(err)    //fail
})
.catch((err) => {
    console.log(err);
})

4、Promise的API

  • Promise.all(),接受一个数组作为参数,数组的每一项是一个Promise实例
    • 只要有一个Promise的状态变为reject,Promise.all就变为reject,只有当数组里的Promise实例状态都变为resolve时,Promise.all状态才变为resolve
let p1 = new Promise((resolve, reject) => {})
let p2 = new Promise((resolve, reject) => {})
let p3 = new Promise((resolve, reject) => {})

let p4 = Promise.all([p1, p2, p3])

p4.then((data) => {
  // 三个都成功则成功  
}, (err) => {
  // 只要有一个失败,就判定为失败 
})
  • Promise.race(),接受一个数组作为参数,数组的每一项是一个Promise实例
    • 与Promise.all相反, 只要有一个Promise状态变为resolve, Promise.all状态就变为resolve
let p1 = new Promise((resolve, reject) => {})
let p2 = new Promise((resolve, reject) => {})
let p3 = new Promise((resolve, reject) => {})

let p4 = Promise.all([p1, p2, p3])

p4.then((data) => {
  // 只要有一个成功,就判定为成功
}, (err) => {
  // 只有都失败才判定为失败
})
  • Promise.resolve(),将一个值转为Promise对象并返回
    • Promise.resolve方法的参数分成三种情况
    • 参数是一个Promise 实例,则不做任何修改、原封不动地返回这个实例
    • 参数是一个thenable对象(指具有then方法的对象)
       //Promise.resolve方法会将thenable对象转为 Promise 对象,然后就立即执行thenable对象的then方法
       let thenable = {
          then: (resolve, reject) => {
             resolve(1);
          }
       }
       let p = Promise.resolve(thenable);
       // 上面这一行等价于
       // let p =  new Promise(resolve => resolve(thenable))

       p.then((data) => {
          console.log(data)  // 1
       })
  • 参数是普通的值类型
       //Promise.resolve方法自动返回一个新的 Promise 对象,状态为resolved。
       let p = Promise.resolve('Hello')

       p.then((data) => {
         console.log(data)
       })
  • Promise.reject(),跟Promise.resolve类似也会返回Promise对象,但是该对象的状态为rejected
let p = Promise.reject('err');
// 上面这一行等价于
// let p = new Promise((resolve, reject) => reject('err'))

p.then(null, (err) => {
  console.log(err)  //err
})

根据promiseA+实现一个自己的promise

以后再写