Promise 状态的表现与变化以及执行顺序

Posted loushumei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Promise 状态的表现与变化以及执行顺序相关的知识,希望对你有一定的参考价值。

Promise三种状态:

pending 过程中
resolved 已成功
rejected 已拒绝

状态的表现

pending状态,不会触发then和catch
resolved状态,会触发后续的then回调函数
rejected状态,会触发后续的catch的回调函数

状态变化:

pending–> resolved 成功.
pending–> rejected 失败.
变化不可逆.

// pending状态的Promise
const p1 = new Promise((resolve, reject) => )
console.log('p1', p1) //PromiseStatus: pending


// pending状态的Promise -> resolved状态的Promise:
const p2 = new Promise((resolve, reject) => 
    setTimeout(() => 
        resolve() // Promise.resolve返回一个解析过的Promise对象,状态为resolved
    );
)
console.log('p2', p2) //开始打印时为:pending状态
setTimeout(() => 
    console.log('p2-setTimeout', p2)
); //计时器回调成功:resolved状态


// pending状态的Promise -> rejected状态的Promise:
const p3 = new Promise((resolve, reject) => 
    setTimeout(() => 
        reject() //Promise.reject返回一个解析过的Promise对象,状态为rejected
    );
)
console.log('p3', p3) //开始打印时为:pending状态
setTimeout(() => 
    console.log('p3-setTimeout', p3)
); //计时器回调成功:rejected状态

then和catch对状态的影响: *****

  1. then正常返回resolved状态的Promise,里面有报错则返回rejected状态的Promise.
const p1 = Promise.resolve().then(()=>
    return 100
)
p1.then(() =>  // p1是: then正常返回resolved状态的Promise
    console.log('p1 then') //打印p1 then :resolved触发then回调
)

const p2 = Promise.resolve().then(() => 
    throw new Error('then error')
)
p2.then(() =>  //p2是 :then里面有报错则返回rejected状态的Promise
    console.log('p2 then') 
).catch(() => 
    console.log('p2 catch') //打印p2 catch :rejected触发catch回调
)
  1. catch正常返回resolved状态的Promise,里面有报错则返回rejected状态的Promise.
const p3 = Promise.reject('err').catch(err => 
    console.error(err)
)
p3.then(() =>  //p3是: catch正常返回resolved状态的Promise
    console.log('p3 then') //打印 p3 then :resolved触发then回调
)

const p4 = Promise.resolve().then(() => 
    throw new Error('then error')
)
p4.then(() =>  //p4是 :catch里面有报错则返回rejected状态的Promise
    console.log('p4 then')
).catch(() => 
    console.log('p4 catch') //打印p4 catch :rejected触发catch回调
)

Promise执行顺序常见题目与解析

Promise.resolve().then(() =>  //Promise.resolve()返回的 resolve状态的Promise
    console.log(1) // resolved 触发then回调 : console.log(1);then正常返回resolved状态的Promise
).catch(()=>
    console.log(2)
).then(() =>   //resolved 触发then回调: console.log(3)
    console.log(3)
)
// 1 3

Promise.resolve().then(() =>  // Promise.resolve()返回的 resolve状态的Promise
    console.log(1) // resolved 触发then回调 : console.log(1)
    throw new Error('error1') // then里面有报错则返回rejected状态的Promise
).catch(() =>  // rejected 触发catch回调: console.log(2)
    console.log(2) // catch正常返回resolved状态的Promise
).then(() =>  // resolved 触发then回调: console.log(3)
    console.log(3)
)
// 1 2 3


Promise.resolve().then(() =>  // Promise.resolve()返回的 resolve状态的Promise
    console.log(1) // resolved 触发then回调 : console.log(1)
    throw new Error('error1') // then里面有报错则返回rejected状态的Promise
).catch(() =>  // rejected 触发catch回调: console.log(2)
    console.log(2) // catch正常返回resolved状态的Promise
).catch(() =>  // resolved 触发then回调,无法触发catch回调
    console.log(3)
)
//  1 2 

以上是关于Promise 状态的表现与变化以及执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

promise执行顺序

解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!

深入理解 promise:promise的三种状态与链式调用

JS 中关于Promise的用法,状态,执行顺序详解,面试可用(原创)

JavaScript——异步操作以及Promise 的使用

关于多个Promise对象及then()函数的执行顺序的研究记录