关于promise!

195 阅读2分钟

在我们的项目中会遇到许多代码嵌套,层级调用的关系,这样会导致代码难以维护,有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。

​
  testPromise() {
   new Promise(function (*resolve*, *reject*) {
•    *// resolve("调用成功");*
•    reject("调用失败");
   })
 .then((*res*) => {
    *//then 里面的值通过 resolve拿到*
    alert(res);
  })
  .catch((*err*) => {
  *// reject 会走.catch这个逻辑*
   alert(err);
 });

有三种状态 :

初始状态(pending):不是成功状态也不是失败状态。 执行reslove : 状态由 pending ---> fulfilled 成功状态(fulfilled): 意味着操作成功完成。 执行 reject : 状态由 pending ---> rejected 失败状态(rejected): 意味着操作失败。 他的状态是不可逆的 ,一旦执行成功就不会回到pending状态,也不会回到 rejected状态。 任何时候都可以得到这个结果。所以,Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 rejected。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果!

如果想终止在某个执行链的位置,可以用Promise.reject(new Error())*

new Promise(function (resolve, reject) {
        resolve(1);
      })
        // .then 默认返回的也是一个promise,如果返回的是一个普通数字类型的话,那他就相当于执行了promise的resolve方法
        .then((result) => {
          return new Promise(function (resolve) {
            resolve(result + 1);
          });
          // return result + 1;
        })
        .then((result) => {
          return result + 1;
        })
        .then((result) => {
          // 在这里调用的是promise的静态方法,终止逻辑的执行,会走.catch
          return Promise.reject(new Error(result + "失败"));
          // return result + 1
        })
        .then((result) => {
          return result + 1;
        })
        .catch((error) => {
          alert(error);
        });
    },

async 和 await

async

作为一个关键字放在函数的前面,使用async修饰的函数是一个异步函数,意味着该函数的执行不会阻塞后面代码的执行,异步函数的调用跟普通函数是一样。

await

await即等待,用于等待一个Promise对象。它只能在被async修饰的函数中使用,否则会报错,它的返回值不是Promise对象而是Promise对象处理之后的结果。被await修饰的函数等需要强制等待这个函数执行后,才执行async代码块中其他的代码,而代码块之外的代码不会阻塞。

​
    async testAsync() {
      const result = await new Promise(function (reslove) {
        // 在五秒之后拿到结果
        setTimeout(() => {
          reslove("别卷了");
        }, 5000);
      });
      alert(result);
    },
​
    async testAsync2() {
      await this.testAsync(); //由于被  async 修饰过变成了异步方法,不会阻塞底下代码的执行
      alert(666);
    },

\