【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>} |
Promise 静态方法
Promise.resolve()
Promise.reject()
Promise.all()
Promise.race()
Promise.any()
Promise.resolve()
Promise.resolve 方法的参数分成四种情况
- 参数是一个 Promise 实例:不做任何修改、原封不动地返回这个实例
let p = new Promise((resolve, reject) => { resolve('成功') }) |
- 参数是一个 thenable 对象 (thenable 对象指的是具有 then 方法的对象): 会将这个对象转为 Promise 对象,然后立即执行 thenable 对象的 then 方法,执行结果作为后续方法的参数
let thenable = { |
- 参数不是具有 then 方法的对象,或根本就不是对象:返回一个新的状态为 resolved 的 Promise 对象,参数会作为后续方法的参数
const p = Promise.resolve('张三') |
- 不带有任何参数:返回一个新的状态为 resolved 的 Promise 对象
const p = Promise.resolve() |
Promise.reject()
Promise.reject (reason) 方法也会返回一个新的 Promise 实例,该实例的状态为 rejected
Promise.reject () 方法的参数,会原封不动地作为 reject 的理由,变成后续方法的参数。这一点与 Promise.resolve 方法不一致
const thenable = { |
上面代码中,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) |
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 函数中使用