Promise是处理异步请求的一种解决方案,有了Promise就可以将异步操作用同步操作的流程表达处理,避免了回调函数的嵌套。Promise有三种状态,进行中、成功和失败。状态的改变只有两种情况,进行中→成功和进行中→失败,一旦状态改变,就会一直保持这个结果。下面是一个Promise实例,我们根据实例的代码来了解Promise
const promise = new Promise(function(resolve, reject) { //Promise构造函数接受一个函数作为参数,该函数由两个js引擎提供的函数作为参数
if (/* 异步操作成功 */){
resolve(value); //状态进行中→成功时,调用resolve,并将异步操作成功的结果,通过参数传递出去
} else {
reject(error); //状态进行中→失败时,调用reject,并将操作失败的结果,通过参数传递出去
}
});
实例生成后,我们就可以指定不同状态的回调函数了。
promise.then(function(value) {
// 异步操作成功时执行,value为resolve传递的操作结果
}).catch(function(error) {
// 异步操作失败时执行,也可以捕获then方法中执行的错误
}).finally(function() {
// 不管成功和失败,都会执行,不接受任何参数,本质上是then的特例
});
事实上,then方法可以接受两个函数作为参数,第一个函数在异步操作成功时执行,第二个函数在异步操作失败时执行,但上面的写法更好一些,理由是catch可以捕获then中的错误,写法也更接近于同步的try/catch写法。
下面是一个实例
new Promise((resolve, reject) => {
resolve({"name":"Annie"});
console.log({"name":"Keith"});
}).then(r => {
console.log(r);
return r
});
例子中,调用resolve后,后面的console.log({"name":"Keith"})还会继续执行,并且会首先执行。因为resolve和reject是在本轮事件的末尾执行,总是晚于本轮的同步任务。执行结果如下