Promise 执行流程详细解释

  • 先来看一个Promise实例
new Promise((resolve, reject) => { // 只能调用 resolve 和 reject 的其中一个
    setTimeout(() => {
      console.log('异步任务执行...')
      // 如果异步任务执行成功 value 由自己指定
      resolve(value) // 改变当前 Promise实例对象的状态为 fulfilled
      // 如果异步任务执行失败 reason 由自己指定
      // reject(reason) // 改变当前 Promise实例对象的状态为 rejected
    }, 100) // executor
  }).then(
    value => {
      console.log('Promise 成功后的回调' + value)
    }, // onResolved()
    reason => {
      console.log('Promise 失败后的回调' + reason)
    } // onRejected()
  ).then(
    value => {
      console.log('Promise 成功后的回调' + value)
    },
    reason => {
      console.log('Promise 失败后的回调' + reason)
    }
  )

new Promise(executor) 中传递的回调函数有一个名称 一般叫做 executor(执行器函数),这个执行器函数中的代码是立即执行的,什么意思呢?就是调用 (new Promise(executor) )后,内部会立即执行executor回调函数,而不会进入任务队列。

new Promise(executor) 返回的是一个 Promise 实例对象,这个对象的 then() 可以用来指定 Promise 实例对象成功或失败后的回调函数,成功后的回调函数叫:onResolved() ;失败的回调函数叫:onRejected()。Promise 有三种状态 分别是 pending (等待中)、fulfilled(已完成) 、rejected (已拒绝),这里不细说。then() 的返回值也是一个 Promise 实例对象,这也是Promise能链式调用的关键。既然是 Promise ,当然也会有三种状态,那么它的状态由谁决定呢?由 onResolved() 或者onRejected() 的返回值(这里叫做 result)决定,如果显式指定返回值,默认返回undefined。如何决定呢?有如下三种情况,至于为什么是这样,这是由 Promise 的内部实现去决定的,大家不要纠结,感兴趣的可以去看看源码到底是如何实现下面的效果的。

  1. 如果返回值(这里叫做 result)不是 Promise ,那么 then() 返回的新的 Promise 实例对象的状态为 fulfilled
.then(
  value => {
    console.log('Promise 成功后的回调' + value)
    return 2//数字,字符串,undefined 等都会导致then返回的新的Promise实例对象的状态为fulfilled
 	}, // onResolved()
  reason => {
    console.log('Promise 失败后的回调' + reason)
    return 2 //同上
  } // onRejected()
)
  1. 如果抛出异常(使用 throw 关键字) 那么 then() 返回的新的 Promise 实例对象的状态为 rejected
.then(
  value => {
    console.log('Promise 成功后的回调' + value)
    throw 2 // 只要使用了 throw 关键字 那么 then() 返回的新的 Promise 实例对象的状态为 rejected
 	}, // onResolved()
  reason => {
    console.log('Promise 失败后的回调' + reason)
    throw 2 //同上
  } // onRejected()
)
  1. 如果返回值(这里叫做 result)是 Promise ,那么 then() 返回的新的 Promise 实例对象的状态为 result 的状态决定,意思是如果result是个失败的Promise(状态为rejected),则then() 返回的新的 Promise 实例对象的状态也为rejected;如果result是个成功的Promise(状态为fulfilled),则then() 返回的新的 Promise 实例对象的状态也为fulfilled
.then(
  value => {
    console.log('Promise 成功后的回调' + value)
    return Promise.resolved(value) // 假设返回一个成功的Promise,当前的 then() 返回的新的 //Promise 实例对象的状态也为fulfilled
 	}, // onResolved()
  reason => {
    console.log('Promise 失败后的回调' + reason)
    return Promise.rejected(reason) // 假设返回一个失败的Promise,同理then返回失败的Promise
  } // onRejected()
)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值