【es6】Promise

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

promise 的三个状态

  • pending : 等待 (等待成功或者失败去调用)
  • fulfilled : 成功调用 (resolve)
  • rejected : 失败调用 (reject)

有 throw 也相当于 reject

let p1 = new Promise(() => {}) // Promise {<pending>}
let p2 = new Promise((resolve, reject) => { resolve('成功') }) // Promise {<fulfilled>: '成功'}
let p3 = new Promise((resolve, reject) => { reject('失败') }) // Promise {<rejected>: '失败'}
let p4 = new Promise((resolve, reject) => { throw('报错') }) //Promise {<rejected>: '报错'}

Promise 静态方法

Promise.resolve()
Promise.reject()
Promise.all()
Promise.race()
Promise.any()

Promise.resolve()

Promise.resolve 方法的参数分成四种情况

  1. 参数是一个 Promise 实例:不做任何修改、原封不动地返回这个实例
let p = new Promise((resolve, reject) => { resolve('成功') })
Promise.resolve(p) === p // true
  1. 参数是一个 thenable 对象 (thenable 对象指的是具有 then 方法的对象): 会将这个对象转为 Promise 对象,然后立即执行 thenable 对象的 then 方法,执行结果作为后续方法的参数
let thenable = {
then: function(resolve, reject) { resolve('张三') }
}
let p = Promise.resolve(thenable)
p.then((res) => {
console.log(res) // '张三'
})
  1. 参数不是具有 then 方法的对象,或根本就不是对象:返回一个新的状态为 resolved 的 Promise 对象,参数会作为后续方法的参数
const p = Promise.resolve('张三')
p.then((res) => {
console.log(res) // '张三'
})
  1. 不带有任何参数:返回一个新的状态为 resolved 的 Promise 对象
const p = Promise.resolve()
p.then((res) => {
console.log(res) // undefined
})

Promise.reject()

Promise.reject (reason) 方法也会返回一个新的 Promise 实例,该实例的状态为 rejected

Promise.reject () 方法的参数,会原封不动地作为 reject 的理由,变成后续方法的参数。这一点与 Promise.resolve 方法不一致

const thenable = {
then(resolve, reject) {
reject('出错了')
}
}
Promise.reject(thenable)
.catch(e => {
console.log(e === thenable) // true
})

上面代码中,Promise.reject 方法的参数是一个 thenable 对象,执行以后,后面 catch 方法的参数不是 reject 抛出的 “出错了” 这个字符串,而是 thenable 对象。

all 和 race

Promise.all ():resolve 回调执行是在所有输入的 promise 的 resolve 回调都结束,或者输入的 iterable 里没有 promise 了的时候。reject 回调执行是,只要任何一个输入的 promise 的 reject 回调执行或者输入不合法的 promise 就会立即抛出错误,并且 reject 的是第一个抛出的错误信息

Promise.race ():始终返回最快的那一个 promise,不管 resolve 还是 reject

Promise.prototype 成员

  • then() :用于获取异步操作成功时的结果 -> resolve
  • catch():用于获取异步操作失败时的结果 -> reject
  • finally():不管 Promise 最后状态如何,都会执行的操作,finally 方法的回调函数不接受任何参数
promise.then(successCallback, failureCallback)
promise.catch(failureCallback)

then 第一个参数是 resolved 状态的回调函数,如果第一个参数不是函数,则会在内部被替换为 (x) => x,即原样返回 promise 最终结果的函数
then 第二个参数(可选)是 rejected 状态的回调函数
catch (failureCallback) 是 then (null, failureCallback) 的缩略形式
then 方法返回的是一个新的 Promise 实例

async 和 await

  • async /await 用同步编写代码的方式 处理异步操作的一个方案
  • async:修饰 (修饰一个内部有异步操作的函数) 格式 : async + 函数 (里面有异步操作的函数)
  • await : 等待 (等上一个异步操作完成啊,修饰 一个结果是 promise 的) 异步操作 格式 : await + 异步操作 (结果 promise 对象)
  • async 和 await 是成对出现的,await 只能在 async 函数中使用

https://juejin.cn/post/6945319439772434469#heading-4