什么是Promise
- 概述:Promise是异步编程的一种解决方案,从语法上讲,Promise是一个对象,可以获取异步操作的消息
- 目的:
(1)避免地域回调问题
(2)Promise对象提供了简洁的API,使得控制异步操作更加容易 - 可以链式调用
- resolved,rejected函数:在异步事件状态pendding->resolved回调成功时,通过调用resolved函数返回结果;当异步操作失败时,回调用rejected函数显示错误信息
- then的用法:then中传了两个参数,第一个对应resolve的回调(返回成功的信息),第二个对应reject的回调(返回失败的信息)
p.then((data) => {
console.log('resolved',data);
},(err) => {
console.log('rejected',err);
}
);
- catch方法:
它可以和 then 的第二个参数一样,用来指定 reject 的回调 - all方法:
Promise 的 all 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。 - race方法:
race 的用法与 all 一样,只不过 all 是等所有异步操作都执行完毕后才执行 then 回调。而 race 的话只要有一个异步操作执行完毕,就立刻执行 then 回调。
Promise的两个特点
-
Promise对象的状态不受外界影响
(1)pending 初始状态
(2)fulfilled 成功状态
(3)rejected 失败状态
Promise 有以上三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态 -
Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending变成fulfilled或者由pending变成rejected
应用场景:
封装ajax,axios的get,post封装,微信小程序中封装wx.request(),uniapp开发中uni.request()
- 请求某个图片资源
function requestImg(){
var p = new Promise(function(resolve, reject){
var img = new Image();
img.onload = function(){
resolve(img);
}
img.src = 'xxxxxx';
});
return p;
}
//延时函数,用于给请求计时
function timeout(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
reject('图片请求超时');
}, 5000);
});
return p;
}
Promise.race([requestImg(), timeout()]).then(function(results){
console.log(results);
}).catch(function(reason){
console.log(reason);
});
//上面代码 requestImg 函数异步请求一张图片,timeout 函数是一个延时 5 秒的异步操作。我们将它们一起放在 race 中赛跑。
//如果 5 秒内图片请求成功那么便进入 then 方法,执行正常的流程。
//如果 5 秒钟图片还未成功返回,那么则进入 catch,报“图片请求超时”的信息。