基于电子签名业务Bug,总结的Promise基础

523 阅读5分钟

Promise 是 JavaScript 中处理异步操作的一种机制。它提供了一种更优雅、更便捷的方式来处理异步操作,使得异步代码更易于理解和维护。

Promise 的主要特点和用途包括:

  1. 异步操作的封装:Promise 封装了一个异步操作,并提供了对该操作的处理和状态管理。它可以代表一个未完成、进行中或已完成的异步操作。
  2. 解决回调地狱问题:在传统的回调函数中,多个异步操作嵌套在一起会形成回调地狱,代码变得难以阅读和维护。而 Promise 可以通过链式调用的方式,使得异步操作变得更加清晰、可读性更高,避免了回调地狱。
  3. 提供更优雅的错误处理机制:Promise 提供了统一的错误处理机制,可以在异步操作中捕获错误,并使用 catch 方法统一处理异常。这样可以更方便地处理和传递错误,使得错误处理更加优雅和集中。
  4. 支持并发和顺序执行:Promise 支持多个异步操作并发执行,可以使用 Promise.all 方法将多个 Promise 实例组合成一个新的 Promise,等待所有的 Promise 完成。另外,通过 then 方法可以按照一定的顺序执行多个异步操作,实现串行执行。

1.结合业务需求实现请求

在需要在一个请求完成之后再发送另一个请求的业务场景中,可以使用 Promise 的链式调用来实现。Promise 提供了 then 方法,它返回一个新的 Promise 对象,可以在该 Promise 对象中继续执行后续的异步操作。

下面是一个示例,展示如何在一个请求完成后发送另一个请求:

javascriptCopy code
function fetchData(url) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url);
    xhr.onload = function() {
      if (xhr.status === 200) {
        resolve(xhr.responseText);
      } else {
        reject(new Error(xhr.statusText));
      }
    };
    xhr.onerror = function() {
      reject(new Error('Network error'));
    };
    xhr.send();
  });
}

// 发送第一个请求
fetchData('https://api.example.com/data1')
  .then(response1 => {
    console.log('第一个请求成功:', response1);
    // 在第一个请求成功后发送第二个请求
    return fetchData('https://api.example.com/data2');
  })
  .then(response2 => {
    console.log('第二个请求成功:', response2);
    // 在第二个请求成功后执行其他操作...
  })
  .catch(error => {
    console.error('请求失败:', error);
  });

在上述示例中,我们首先发送第一个请求,并在第一个请求成功后,在 then 方法中发送第二个请求。then 方法返回一个新的 Promise 对象,可以在该对象上继续调用 then 方法来处理第二个请求的结果。

这样,第二个请求将会在第一个请求完成后执行,并且可以在第二个 then 方法中处理第二个请求的结果。如果其中任何一个请求失败,将会进入 catch 方法来统一处理错误。

通过使用 Promise 的链式调用,我们可以轻松地实现在一个请求完成后再发送另一个请求的业务需求,并保持代码的可读性和可维护性。

1.2 Promise.all的用法

getMethodsFirst() {
  return new Promise((resolve, inject) => {
    // 调用一个后端接口,此处是调用已经封装好了的axios,所以大家可以根据自己项目中的接口方法灵活访问
    getMethodsFirstApi().then(
      (res) => {
        resolve(res); // 返回获取到的正确的数据
      },
      (req) => {
        inject(req); //返回失败信息
      }
    );
  });
}

getMethodsSecond() {
  return new Promise((resolve, inject) => {
    // 方法二的后端api调用接口
    getMethodsSecondApi().then(
      (res) => {
        resolve(res); // 返回获取到的正确的数据
      },
      (req) => {
        inject(req); //返回失败信息
      }
    );
  });
}

init() {
  // 需要等到getMethodsFirst方法和getMethodsSecond方法都返回数据后再执行
  Promise.all([this.getMethodsFirst(), this.getMethodsSecond()]).then(
    (res) => {
      // res 接收的是一个数组,.all()方法中请求几个方法,数组的值就有几个
      // res[0] 是this.getMethodsFirst()的返回成功的值 , res[1] 是this.getMethodsSecond()的返回成功的值
      // 接收到返回值之后,就可以做自己想要做的事情了
    }
  );
}

1.3 Promise基础

  1. 什么是 Promise?请解释 Promise 的工作原理。

    • Promise 是 JavaScript 中处理异步操作的一种机制,用于管理异步操作的状态和结果。
    • Promise 有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。
    • 当 Promise 被创建时,它处于 pending 状态,可以转变为 fulfilled 或 rejected 状态。
    • Promise 的状态一旦发生变化,就不会再改变。
  2. Promise 的优势是什么?

    • 可以更好地处理异步操作,避免了回调地狱(callback hell)。
    • 提供了更清晰和可读性更强的代码结构,使异步代码更易于编写和维护。
    • 支持链式调用,使多个异步操作可以按顺序执行,并对结果进行处理。
  3. Promise 的三个状态是什么意思?如何从一个状态转变为另一个状态?

    • Promise 的三个状态是 pending、fulfilled 和 rejected。
    • 从 pending 状态可以转变为 fulfilled 或 rejected 状态,一旦转变就不可再改变。
    • 当异步操作成功完成时,Promise 的状态会从 pending 转变为 fulfilled,并返回异步操作的结果。
    • 当异步操作失败时,Promise 的状态会从 pending 转变为 rejected,并返回失败的原因。
  4. 如何创建一个 Promise 实例?

    • 可以使用 Promise 的构造函数来创建一个 Promise 实例,构造函数接受一个执行器函数作为参数。
    • 执行器函数接受两个参数:resolve 和 reject,用于将 Promise 的状态从 pending 转变为 fulfilled 或 rejected。
    • 在执行器函数中可以执行异步操作,并在操作完成时调用 resolve 或 reject。
  5. 如何处理 Promise 的结果和错误?

    • 可以使用 then 方法来处理 Promise 的成功结果,并使用 catch 方法来处理 Promise 的错误。
    • then 方法接受一个回调函数作为参数,在 Promise 成功时调用该回调函数,并将成功的结果作为参数传递。
    • catch 方法接受一个回调函数作为参数,在 Promise 失败时调用该回调函数,并将失败的原因作为参数传递。
  6. Promise 的链式调用是什么意思?如何进行链式调用?

    • Promise 的链式调用是指将多个 Promise 实例连接起来,形成一个 Promise 链,依次处理多个异步操作的结果。
    • 可以在一个 Promise 的 then 方法中返回另一个 Promise 实例,从而实现链式调用。
    • 链式调用可以通过多次调用 then 方法来实现,每次调用 then 方法都会返回一个新的 Promise 实例,使得可以继续进行下一个操作。