Promise then

Promise代表着一个异步操作的最终返回结果。与Promise主要的交流方法就是通过它的then方法,它注册了一个回调函数去接收Promise的最终值或状态没有变为fulfilled的原因。

Promise状态

Promise只能是这三种状态的其中之一:

  • pending
  • fulfilled
  • rejected
pending

Promisepending状态时,可能正在向fulfilledrejected状态过渡

fulfilled

Promisefulfilled状态时,一定不会向其它状态过渡,并且一定会有一个值且无法修改

rejected

Promiserejected状态时,一定不会向其它状态过渡,并且一定会有一个原因且无法修改

then方法

一个Promise对象必须提供一个then方法去获得它【当前或最终的】【值或原因】,这句话有点绕,所以拿括号括起来,Promise的then方法接收两个参数:

promise.then(onFulfilled, onRejected)

并且onFulfilledonRejected都是可选参数,如果传入的参数不是函数,那么将被忽视:

promise.then(1, 2) // 1 & 2 will be ignored
  • 如果onFulfilled是一个函数:
    它将在promise转换成fulfilled状态后被调用,它的第一个参数就是promise的值:
promise.then(function (value) {
    console.log(value)
})

并且它不会在promise转换为fulfilled状态之前被调用,且只执行一次。

  • 如果onRejected是一个函数:
    它将在promise转换成rejected状态后被调用,它的第一个参数就是promise未转变为fulfilled状态的原因:
promise.then(function (value) {
    console.log(value)
}, function (reason) {
    console.log(reason)
})

并且它不会在promise转换为rejected状态之前被调用,且只执行一次。

  • onFulfilledonRejected必须传入函数,并且其内不绑定this,也就是说,在严格模式下,在onFulfilledonRejected函数中使用this,得到的值将会是undefined;在非严格模式下,其中this将会是全局对象

  • 在同样一个promise中可能会有多个then方法

    • 当pormise的状态变为fulfilled时,所有相应的onFulfilled回调函数必须按照它们调用then的顺序执行
    • 当promise的状态变为rejected时,所有相应的onRejected回调函数必须按照它们调用then的顺序执行
  • then一定会返回一个Promise对象

const promise1 = new Promise((resolve, reject) => {})

const promise2 = demo.then(onFulfilled, onRejected)
// Promise(<pending>)
  • 如果onFulfilledonRejected返回了一个值x,那么promise2将会是一个状态为fulfilled且值为x的Promise
const promise1 = new Promise((resolve, reject) => { resolve(6) })
const onFulfilled = () => 9
const onRejected = () => {}
const promise2 = promise1.then(onFulfilled, onRejected)
// Promise {<fulfilled>: 9}
  • 如果onFulfilledonRejected中抛出了异常e,那么promise2将会是一个状态为rejected且值为e的Promise
const promise1 = new Promise((resolve, reject) => { resolve(6) })
const onFulfilled = () => { log.console(1) }
const onRejected = () => {}
const promise2 = promise1.then(onFulfilled, onRejected)
/* 
 * Promise {<rejected>: ReferenceError: log is not defined at <anonymous>:1:33}
 */
  • 如果onFulfilled不是函数并且promise1的状态为fulfilledpromise2将会是一个状态为fulfilled且值与promise1相同的Promise
const promise1 = new Promise((resolve, reject) => { resolve(1) })
const onFulfilled = 8
const onRejected = () => {}
const promise2 = promise1.then(onFulfilled, onRejected)
// Promise {<fulfilled>: 1}
  • 如果onRejected不是函数并且promise1的状态为rejectedpromise2将会是一个状态为rejected且值与promise1相同的Promise
const promise1 = new Promise((resolve, reject) => { reject(1) })
const onFulfilled = () => {}
const onRejected = 8
const promise2 = promise1.then(onFulfilled, onRejected)
// Promise {<rejected>: 1}

资料来自Promise/A+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值