前言
上一篇我们介绍了async/await和Promise的基本用法,理解了Promise的异步编程原理,但是Promise也提供了很多静态方法,在实际应用中往往会使用这些静态方法,这些静态方法比它的正常用法理解起来可能更困难一些,属于更深一层的东西,所以本篇我们就重点研究一下Promise的静态方法,供大家参考。
一、Promise.resolve
上一篇研究async/await时就用到Promise.resolve,当时主要为了更好的理解async/await的异步编程所以没有详细研究Promise.resolve,这里我们就结合上篇的例子来好好理解一下。
UserManage.vue中查询用户信息的函数:
const userList = async () => {
let result = await userListService();
console.log(result);
//渲染视图
users.value = result.data;
}
它实际上就是下面这一段Promise代码,这里使用了Promise.resolve
const userList = () => {
return Promise.resolve(userListService()).then(result => {
console.log(result);
//渲染视图
users.value = result.data;
}).catch(error => {
console.log(error);
});
}
如果按照Promise的基本用法来理解,应该是这样:当我们调用resolve方法时,Promise的状态就会变成fulfilled,此时会调用then方法的onFulfilled回调函数,那应该直接就执行then里面的代码。但实际上是先执行userListService方法,获取到数据后才执行then里面的代码,为什么呢?
我们先来看看Promise.resolve的用法,根据所带参数类型它有四种用法:
1、参数为空时返回一个新的状态为fulfilled的Promise
2、参数为非then方法时返回一个新的状态为fulfilled的Promise
3、参数为then方法时返回一个新的Promise,而它的状态由自身的then()方法控制
then方法格式如下:
then(resolve, reject) {
resolve("thenable");
}
4、参数为Promise时直接返回这个Promise
也就是说不管参数是什么类型都是返回一个Promise实例,那它后面的then方法就是它返回的Promise实例的then方法,then方法的onFulfilled回调函数就由这个返回的Promise实例控制。
//获取用户详细信息
export const userListService = ()=>{
return request.get('/user')
}
再来看看userListService方法,它实际上是调用了request.get(‘/user’) 方法,具体来说,request.get是 Axios 提供的一个方法,用于发送 GET 请求。Axios 的所有请求方法(如 get, post, put, delete 等)都会返回一个 Promise,这里又隐藏了一个Promise。那这个就属于第四种用法,Promise.resolve直接返回userListService,就相当于下面这段代码。
userListService().then(result => {
console.log(result);