为了解决回调地狱问题,在ES6中提供了Promise
Promise实际上就是在原本的异步API上面包裹一层函数,其中Promise参数函数的resolve , reject两个参数,实际上和普通的回调函数一样,都接受一个回调函数作为实参,而在运行时返回一个实参给调用他的then或catch两个回调函数,这样就会获得异步API中的执行结果
而这个包裹的一层函数就是promise对象
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
if (true) {
resolve({name: '张三'})
}else {
reject('失败了')
}
}, 2000);
});
promise.then(result => console.log(result); // {name: '张三'})
.catch(error => console.log(error); // 失败了)
而且promise还可以链式调用
Promise 的链式调用是通过 .then() 和 .catch() 方法实现的,其中 .catch() 等价于 .then(null, onRejected),因此我们在接下来的内容当中只需研究 .then() 方法的性质即可。
.then() 方法除了用于注册监听函数之外,本身也会创建并返回一个 Promise 对象,这个 Promise 对象用于表征回调函数的执行情况。
当回调函数执行成功时(内部的resolve函数调用) Promise 状态将变更为 ‘fulfilled’,执行过程抛出异常 (内部的rejected函数调用)Promise 状态则变成 ‘rejected’
在链式调用过程当中,假如某个环节的 Promise 不存在相应状态的监听回调函数,那么这个 Promise 的状态将会往下透传
即,Promise中回调函数执行,却没有相应的then()或catch()处理,所以会将上一个 Promise 的状态持续透传了下去。
.then() 方法会将回调函数的执行结果(then中回调函数的return)记录下来,并作为下一个 onFulfilled 回调的参数将其传递下去
由于回调函数可以返回任何结果,甚至返回一个 Promise 对象也是可行的。
回调函数所抛出的错误将作为下一个 onRejected 的参数传递下去