Promise代表着一个异步操作的最终返回结果。与Promise主要的交流方法就是通过它的then方法,它注册了一个回调函数去接收Promise的最终值或状态没有变为fulfilled的原因。
Promise状态
Promise只能是这三种状态的其中之一:
pendingfulfilledrejected
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+