Appearance
几个关键问题
改变 promise 状态的三种方式
javascriptconst p = new Promise((resolve, reject) => { // resolve('suc') // pending => resolved // reject('fail') // pending => rejected // throw new Error('err') // pending => rejected })promise 指定多个成功/失败的回调函数,都会调用吗?
当Promise对象改变状态时对应回调都会调用
javascriptconst p = new Promise((resolve, reject) => { resolve('suc') }) p.then(value => { console.log(value) // suc }) p.then(value => { console.log(value) // suc }) const p2 = new Promise((resolve, reject) => {}) p2.then(value => { console.log(value) // 不执行,状态没有改变 }) p2.then(value => { console.log(value) // 不执行,状态没有改变 })改变 promise 状态和该变状态后的回调谁先执行
都有可能,正常情况下是先指定回调再改变状态,但也可以先改变状态再指定回调
javascript// 先指定回调再改变状态从而执行回调 const p = new Promise((resolve, reject) => { setTimeout(() => { resolve('suc') }, 1000); }) p.then(value => { console.log(value) }) // 先改变状态再指定回调并执行回调 const p = new Promise((resolve, reject) => { resolve('suc') }) p.then(value => { console.log(value) }) // 或者 setTimeout(() => { p1.then(val => { console.log(val) }) }, 1000);then回调什么时候执行
如果先改变状态,当定义完 then 回调后会立即调用 then 回调得到数据
如果先指定回调,再改变状态,那么需要等改变状态后才调用 then 回调
then()返回的promise对象结果状态由什么决定?
如果抛出异常,返回失败的Promise,reason就是抛出的异常
返回一个非 promise 的任意值,或者不返回,会返回成功的 promise,value 就是返回的 值,不返回时 value 就是 undefined
返回一个 promise,就由这个返回的 promise 决定,可能是fuifilled 或 rejectd 或 pendding
Promise 如何串连多个操作任务
- 通过 then 的链式调用
异常穿透
当使用 promise 的 then 链式调用时,可以在最后指定失败的回调,前面的任何操作出现了 异常,都会传到最后失败的回调中处理,前面的 then 回调中就可以不指定失败的回调了。 catch()返回 promise,之后可以继续链式调用 then。
中断 promise 链
当使用Promise的then链式调用时,在中间中断,不再调用后面的回调函数。
有且只有一种方式:then回调中返回一个 pendding 状态的 Promise 对象。之后因为状态没有 改变,回调都不会执行
javascriptconst p = new Promise((resolve, reject) => { resolve('suc') }) p .then(value => { console.log(value) // suc }) .then(value => { return new Promise((resolve, reject) => {}) }) .then(value => { console.log(value) // 不执行 })