Promise基本用法

83 阅读3分钟

Promise基本用法

Promise是什么

  • Promise是异步编程的一种解决方案,可以理解成一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,也就是说Promise对象代表了一个尚未完成且最终会返回一个值(或者被拒绝)的操作。
  • 从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的 API,各种异步操作都可以用同样的方法进行处理。

Promise对象有以下两个特点。

  1. 对象的状态不受外界影响。
    Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
  2. 一旦状态改变,就不会再变,任何时候都可以得到这个结果。
    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构造函数接受一个函数作为参数,该函数的两个参数分别是resolvereject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

  • resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去。
  • reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。 也就是说,如果在调用resolvereject函数时带有参数,那么它们的参数会被传递给回调函数。比如,对于如下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对象。