Promise
代表着一个异步操作的最终返回结果。与Promise
主要的交流方法就是通过它的then
方法,它注册了一个回调函数去接收Promise的最终值或状态没有变为fulfilled
的原因。
Promise状态
Promise
只能是这三种状态的其中之一:
pending
fulfilled
rejected
pending
当Promise
为pending
状态时,可能正在向fulfilled
或rejected
状态过渡
fulfilled
当Promise
为fulfilled
状态时,一定不会向其它状态过渡,并且一定会有一个值且无法修改
rejected
当Promise
为rejected
状态时,一定不会向其它状态过渡,并且一定会有一个原因且无法修改
then方法
一个Promise
对象必须提供一个then
方法去获得它【当前或最终的】【值或原因】,这句话有点绕,所以拿括号括起来,Promise的then
方法接收两个参数:
promise.then(onFulfilled, onRejected)
并且onFulfilled
、onRejected
都是可选参数,如果传入的参数不是函数,那么将被忽视:
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
状态之前被调用,且只执行一次。
-
onFulfilled
和onRejected
必须传入函数,并且其内不绑定this,也就是说,在严格模式下,在onFulfilled
或onRejected
函数中使用this,得到的值将会是undefined
;在非严格模式下,其中this将会是全局对象 -
在同样一个promise中可能会有多个
then
方法- 当pormise的状态变为
fulfilled
时,所有相应的onFulfilled
回调函数必须按照它们调用then
的顺序执行 - 当promise的状态变为
rejected
时,所有相应的onRejected
回调函数必须按照它们调用then
的顺序执行
- 当pormise的状态变为
-
then
一定会返回一个Promise
对象
const promise1 = new Promise((resolve, reject) => {})
const promise2 = demo.then(onFulfilled, onRejected)
// Promise(<pending>)
- 如果
onFulfilled
或onRejected
返回了一个值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}
- 如果
onFulfilled
或onRejected
中抛出了异常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的状态为fulfilled
,promise2将会是一个状态为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的状态为rejected
,promise2将会是一个状态为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+