- 先来看一个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 的内部实现去决定的,大家不要纠结,感兴趣的可以去看看源码到底是如何实现下面的效果的。
- 如果返回值(这里叫做 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()
)
- 如果抛出异常(使用 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()
)
- 如果返回值(这里叫做 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()
)