Promise的API:
Promise构造函数:Promise(executor{})
- executor函数:执行器(resolve,reject)=>{}
- resolve函数:内部定义成功时执行的函数
- reject函数:内部定义失败时执行的函数
executor函数会在Promise内部立即同步调用,异步操作在执行器中执行。
Promise.prototype.then方法:(onResolved,onRejected)=>{}
- onResolved函数:成功的回调函数(value)=>{}
- onRejected函数:失败的回调函数(reason)=>{}
指定用于得到成功value回调和得到失败的reason回调,返回一个新的Promise对象。
Promise.prototype.catch方法:(onrejected) => {} 用于捕获失败的回调
Promise.resolve方法:(value) => {}
返回一个成功/失败的promise对象。
- 如果value为非Promise类型的对象,则返回的结果为成功的Promise对象。
- 如果value为Promise对象,则参数的结果决定了返回的结果。
let p1 = Promise.resolve(123) console.log(p1) // 返回Promise{123} let p2 = Promise.resolve(new Promise((resolve, reject) => reject('Error'))) p2.catch(reason => { console.log(reason) // 对error进行捕获处理 }) console.log(p2) // 返回 Promise{<rejected> 'Error'}
Promise.rejected方法:(reason) => {}
返回一个失败的Promise对象。状态为失败,结果为传入的参数值。
Promise.all方法:(promises) => {}
promises为包含n个promise的数组。返回一个新的promise对象,只有所有的promise成功才成功,有一个失败即失败。
Promise.race方法:(promises) => {}
返回一个新的promises对象,对象的状态为第一个完成promise结果的状态。
Promise状态修改:① resolve函数调用:pending=>resolved ② reject函数调用:pending=>rejected ③ throw抛出错误:pending=>rejected
改变Promise状态和指定回调函数执行先后顺序:均有可能。
- 正常情况下,先指定回调函数,再进行状态改变。
- 当执行器函数中为同步任务时,则先进行状态改变再进行指定回调函数。
- 反之为异步任务时,先指定回调函数,再进行状态改变。
如果想先执行状态改变,再进行指定回调函数:① 直接再执行器内调用resolve/reject方法。② 延长更久时间调用then方法。
数据得到的时机:① 如果是先改变状态,则等指定回调函数后直接调用回调函数,得到数据。② 如果是先指定回调函数,则状态发生改变时就会调用回调函数,得到数据。
Promise的then方法执行完毕后新对象的状态:由then方法指定的回调函数的执行结果所决定
① 如果抛出异常,新promise状态变为rejected,reason为抛出的异常。
② 如果返回的是非promise的任意值,则新promise状态变为resolved,value为返回值。
③ 如果返回的是另一个新promise,则此promise的结果成为新promise的结果。
Promise可以串联多个操作任务:通过then方法,形成链式调用。
(then方法返回值为指定回调函数的返回值,嵌套时若指定的回调函数无返回值则当前返回值为undefined)
let p = new Promise((resolve, reject) => { setTimeout(() => { resolve('OK') }, 1000) }) p.then(value => { return new Promise((resolve, reject) => { resolve('Success') }) }).then(value => { console.log(value) }).then(value => { console.log(value) // 返回 undefined,由于指定的回调函数无返回值 })
Promise的异常穿透:当使用promise的then链式调用时,可以在最后指定失败的回调。前面操作出现的任何异常都会传到最后进行处理。
中断Promise链:只能采取返回pending状态的新Promise对象(利用数据返回的特点,状态一直为pending不能改变则回调函数不会执行,则不会执行后续操作)
let p = new Promise((resolve, reject) => { setTimeout(() => { resolve('ok') }, 1000); }) p.then(value => { console.log(value) return new Promise(() => { }) }).then(value => { console.log(111) }).then(value => { console.log(222) })
Promise自定义封装:
若实现同步执行,则在构造函数内部直接调用
标签:resolve,函数,前端,value,Promise,promise,回调,Day41 From: https://www.cnblogs.com/LWHCoding/p/16747624.html