Promise基本用法
Promise是什么
Promise是异步编程的一种解决方案,可以理解成一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,也就是说Promise对象代表了一个尚未完成且最终会返回一个值(或者被拒绝)的操作。- 从语法上说,
Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的 API,各种异步操作都可以用同样的方法进行处理。
Promise对象有以下两个特点。
- 对象的状态不受外界影响。
Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。- 一旦状态改变,就不会再变,任何时候都可以得到这个结果。
Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。
基本用法
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。
下面代码创造了一个Promise实例。
const promise = new Promise(function(resolve,reject){
//...some code
if(/* 异步操作成功*/){
resolve(value);//异步操作成功完成时调用
}else{
reject(error);
}
}
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去。reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。 也就是说,如果在调用resolve和reject函数时带有参数,那么它们的参数会被传递给回调函数。比如,对于如下http请求:
// 获取表单数据
export function requestFormData(): Promise<any> {
return new Promise((resolve, reject) => {
const messageStore = useMessageStore();
sendGet(
`/api/follow-up/singleData/${messageStore.selectedFile}`,
{},
(res: { data: any }) => {
resolve(res.data.data);
},
(err: any) => {
console.log(err);
}
);
});
}
调用这个函数
let tempInfo = await requestFormData();
在这个例子中,tempInfo就是resolve出去的值,即异步操作成功完成的结果,这是正常的值做为resolve函数参数的情况。
在这里要注意,调用的时候使用await和不使用await是有区别的,如果没有使用await关键字,那么代码会继续执行,而不会等待异步操作的结果。因此,如果没有使用await关键字,tempInfo将会是一个Promise对象,而不是异步操作的结果。
所以,如果没有使用await关键字,tempInfo将会是一个未解决的Promise对象,而不是异步操作的结果。因此,为了确保异步操作的结果在后续代码中被使用,需要使用await关键字来等待异步操作的完成。
除此之外,它的参数还可能是另一个Promise对象。