深入使用 Promise

简介: 前面各种铺垫已经好了,现在我们一起来用一用Promise!

**STOP1

你理解了 Promise 吗?

Promise是一种用于处理异步操作的对象,它代表了一个可能还未完成、但最终会产生结果的操作。使用Promise可以更可靠地管理和组织异步代码,并使其更易于理解和维护。

一个Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。下面是使用Promise的基本语法:

const myPromise = new Promise((resolve, reject) => {
   
  // 异步操作代码

  // 如果操作成功,调用resolve并传递结果
  resolve(result);

  // 如果操作失败,调用reject并传递错误信息
  reject(error);
});

myPromise
  .then((result) => {
   
    // 处理操作成功的结果
  })
  .catch((error) => {
   
    // 处理操作失败的错误信息
  });

在上面的代码中,new Promise()创建了一个新的Promise对象。在构造函数中传入一个执行器函数,该函数接受两个参数:resolve和reject,分别用于操作成功和操作失败的情况。

异步操作的代码应该放在执行器函数中,例如从服务器获取数据、读取文件等。当操作成功时,调用resolve(result)方法,并将操作的结果传递给它。当操作失败时,调用reject(error)方法,并传递相应的错误信息。

接下来,使用.then()方法来处理Promise成功的情况,.catch()方法来处理Promise失败的情况。在.then()中,可以访问到resolve(result)传递的结果;在.catch()中,可以访问到reject(error)传递的错误信息。

如果有多个异步操作需要依次执行,可以使用.then()方法的链式调用,将每个操作放在前一个操作成功后的回调函数中。这样可以确保每个异步操作按顺序执行。

此外,还可以使用.finally()方法来添加一个无论Promise成功与否都会被执行的回调函数。

这是一个简单的Promise教程,涵盖了基本的用法。当你开始实践和探索Promise时,可能会遇到更复杂的情况。但是,理解了基本概念和用法后,你就可以更好地应用Promise来管理异步操作。

STOP2

使用语法糖 async ,await 来进一步改善以往Promise .then链式写法的可阅读性,和代码简洁性,从这个角度出发,咱练练async和await

async function myAsyncFunction() {
   
  try {
   
    // 异步操作代码
    const result = await myPromise; // 等待Promise对象的完成,并将结果赋值给result变量

    // 处理操作成功的结果
    console.log(result);
  } catch (error) {
   
    // 处理操作失败的错误信息
    console.error(error);
  }
}

STOP3

上面的肯定是不够的,咱来用async/await 来解决复杂逻辑的异步操作

假设我们有一个需求:从两个不同的API获取数据,然后根据这些数据执行一些操作。我们将使用async/await来管理这些异步操作的流程。

首先,我们需要定义两个异步函数,每个函数用于获取数据的操作。然后,我们将在一个主函数中调用这些异步函数,并在获取到数据后执行一些操作。以下是示例代码:

async function fetchAPI1() {
   
  // 发起API请求,返回Promise对象
  const response = await fetch('https://api1.example.com');
  const data = await response.json();

  return data;
}

async function fetchAPI2() {
   
  // 发起API请求,返回Promise对象
  const response = await fetch('https://api2.example.com');
  const data = await response.json();

  return data;
}

async function processData() {
   
  try {
   
    // 获取数据并存储在变量中
    const data1 = await fetchAPI1();
    const data2 = await fetchAPI2();

    // 执行一些操作
    const result = data1 + data2;
    console.log(result);
  } catch (error) {
   
    // 处理错误信息
    console.error(error);
  }
}

processData();

在上面的代码中,我们定义了两个异步函数 fetchAPI1 和 fetchAPI2,它们分别从不同的API获取数据。这两个函数使用了await关键字等待API响应,并将响应数据转换成JSON格式。

接下来,我们定义了主函数 processData,在该函数中,我们以顺序的方式调用了两个异步函数并获取数据。当所有异步操作完成后,我们执行了一些操作,例如将两个数据相加,并打印结果。

如果在任何一个异步操作中出现错误,我们会通过try/catch块捕获并处理异常,避免整个程序崩溃。

最后,我们调用主函数 processData 来启动整个异步流程。

使用async/await可以将异步操作的逻辑表达得更清晰和直观。通过顺序地编写代码,我们可以更好地理解每个异步操作的作用,并将它们组合到一个有意义的流程中

STOP4

可以更加复杂一点吗,上面太简单了

假设我们有一个需求:从三个不同的API获取数据,然后分别对每个API返回的结果执行一些异步操作,最后将它们合并成一个结果。以下是示例代码:

async function fetchAPI(url) {
   
  const response = await fetch(url);
  const data = await response.json();

  return data;
}

async function performAsyncOperation(data) {
   
  // 执行一些异步操作,例如对数据进行处理或发送请求
  return processedData;
}

async function mergeResults(results) {
   
  // 合并结果,执行一些其他操作
  return mergedResult;
}

async function main() {
   
  try {
   
    const urls = [
      'https://api1.example.com',
      'https://api2.example.com',
      'https://api3.example.com'
    ];

    const apiPromises = urls.map(url => fetchAPI(url)); // 发起多个API请求并获取Promise数组

    const apiResponses = await Promise.all(apiPromises); // 等待所有API请求完成,并获取结果数组

    const processedDataPromises = apiResponses.map(data => performAsyncOperation(data)); // 对每个API结果进行异步处理

    const processedData = await Promise.all(processedDataPromises); // 等待所有异步处理操作完成,并获取处理后的结果数组

    const mergedResult = await mergeResults(processedData); // 合并结果

    console.log(mergedResult);
  } catch (error) {
   
    console.error(error);
  }
}

main();

在上面的代码中,我们定义了一个fetchAPI函数,用于获取数据,并返回一个Promise对象。我们还定义了一个performAsyncOperation函数,用于执行一些异步操作,并返回结果。

在主函数main中,我们使用urls数组存储三个API的URL。然后,我们使用map方法创建一个包含三个Promise对象的数组apiPromises,每个Promise对象都对应一个API的请求操作。

接下来,我们使用Promise.all方法等待所有API请求完成,并将它们的响应存储在apiResponses数组中。

然后,针对每个API的响应数据,我们使用map方法创建一个包含三个Promise对象的数组processedDataPromises,每个Promise对象都对应一个对数据执行异步操作的操作。

再次使用Promise.all方法等待所有异步操作完成,并将结果存储在processedData数组中。

最后,我们调用mergeResults函数,将处理后的数据作为参数传递给它,并等待合并结果。

最终,我们将合并结果打印到控制台。

这展示了如何使用async/await处理多个并行的异步操作,并对每个操作的结果执行进一步的异步操作,最后将它们合并成一个最终结果。

STOP5

当面对更加复杂的异步操作逻辑时,可以考虑使用Promise链式调用和async/await的组合,以实现更清晰的设计思路。让我为你提供一个更加复杂的示例,展示如何处理多个异步操作的依赖关系。

假设我们有以下需求:从三个不同的API获取数据,然后根据这些数据进行一系列的异步操作,最后返回最终结果。

async function fetchAPI(url) {
   
  const response = await fetch(url);
  const data = await response.json();

  return data;
}

async function performAsyncOperation1(data) {
   
  // 执行操作1,返回结果1
  return result1;
}

async function performAsyncOperation2(data) {
   
  // 执行操作2,返回结果2
  return result2;
}

async function performAsyncOperation3(data, result1, result2) {
   
  // 执行操作3,返回结果3,需要使用操作1和操作2的结果
  return result3;
}

async function main() {
   
  try {
   
    const api1Promise = fetchAPI('https://api1.example.com'); // 获取API1的数据

    const api1Response = await api1Promise; // 等待API1请求完成,并获取结果

    const operation1Promise = performAsyncOperation1(api1Response); // 执行操作1

    const api2Promise = fetchAPI('https://api2.example.com'); // 获取API2的数据

    const api2Response = await api2Promise; // 等待API2请求完成,并获取结果

    const operation2Promise = performAsyncOperation2(api2Response); // 执行操作2

    const api3Promise = fetchAPI('https://api3.example.com'); // 获取API3的数据

    const [operation1Result, operation2Result, api3Response] = await Promise.all([
      operation1Promise,
      operation2Promise,
      api3Promise
    ]); // 等待所有异步操作完成,并获取操作1和操作2的结果,以及API3的响应结果

    const operation3Promise = performAsyncOperation3(api3Response, operation1Result, operation2Result); // 执行操作3,使用所有三个结果

    const finalResult = await operation3Promise; // 等待操作3完成,并获取最终结果

    console.log(finalResult);
  } catch (error) {
   
    console.error(error);
  }
}

main();

在上面的代码中,我们定义了3个异步函数 fetchAPI、performAsyncOperation1 和 performAsyncOperation2,用于从不同的API获取数据并执行一些异步操作。

  1. 在主函数 main 中,我们按照以下顺序执行操作:

  2. 发起API1的请求,并等待它的响应结果。

  3. 在接收到API1的响应后,执行操作1,并获取结果1。

  4. 发起API2的请求,并等待它的响应结果。

  5. 在接收到API2的响应后,执行操作2,并获取结果2。

  6. 发起API3的请求,并等待它的响应结果。

  7. 同时等待操作1、操作2和API3请求的完成,并获取它们的结果。

  8. 使用操作1的结果、操作2的结果以及API3的响应结果,执行操作3,并获取结果3。

  9. 等待操作3的完成,并获得最终结果。

通过使用Promise链式调用和await关键字,我们可以清晰地表示出每个异步操作的依赖关系,使代码更易于理解和维护。

STOP6

.then的链式调用写法和await/async一起搭配起来可以有很好的效果,我们继续来解决需求

从一个API获取数据,根据返回的数据执行不同的异步操作,最终返回处理结果。

async function fetchAPI(url) {
   
  const response = await fetch(url);
  const data = await response.json();

  return data;
}

function performAsyncOperation1(data) {
   
  // 执行操作1并返回Promise
  return new Promise((resolve, reject) => {
   
    // 异步逻辑...

    // 模拟异步操作完成
    setTimeout(() => {
   
      const result = // 计算结果...

      resolve(result);
    }, 2000);
  });
}

function performAsyncOperation2(data) {
   
  // 执行操作2并返回Promise
  return new Promise((resolve, reject) => {
   
    // 异步逻辑...

    // 模拟异步操作完成
    setTimeout(() => {
   
      const result = // 计算结果...

      resolve(result);
    }, 3000);
  });
}

async function main() {
   
  try {
   
    const apiResponse = await fetchAPI('https://api.example.com'); // 获取API的数据

    // 根据返回的数据选择执行哪种操作
    if (apiResponse.condition === 'condition1') {
   
      const operation1Result = await performAsyncOperation1(apiResponse); // 执行操作1
      console.log(operation1Result);
    } else if (apiResponse.condition === 'condition2') {
   
      const operation2Result = await performAsyncOperation2(apiResponse); // 执行操作2
      console.log(operation2Result);
    } else {
   
      console.log('No matching condition');
    }
  } catch (error) {
   
    console.error(error);
  }
}

main();

在上面的代码中,我们定义了两个异步函数 fetchAPI、performAsyncOperation1 和 performAsyncOperation2,用于从API获取数据并执行一些异步操作。

在主函数 main 中,我们按照以下步骤处理:

获取API的响应结果。

根据返回的数据决定执行哪种操作:如果满足 condition1,则执行操作1;如果满足 condition2,则执行操作2;否则打印提示信息。

等待异步操作1或异步操作2完成,并获取它们的结果。

通过使用.then和async/await结合,我们能够根据特定条件选择不同的异步操作,并等待它们的完成。这种方式可以灵活应对各种业务需求,根据实际情况执行相应的异步操作。

目录
相关文章
|
6月前
|
前端开发 API 容器
说说你对 promise 的了解
说说你对 promise 的了解
33 0
|
前端开发 JavaScript 测试技术
6 # 实现简单的 promise
6 # 实现简单的 promise
38 0
|
3月前
|
前端开发 JavaScript
Promise相关的理解
总之,Promise 是现代 JavaScript 异步编程的基石。它们提供了一种优雅的方式来处理异步操作,易于读写和维护,还可以通过其方法来控制复杂的异步流程。
56 5
|
5月前
|
前端开发
|
6月前
|
前端开发
对Promise的理解
对Promise的理解
42 2
|
6月前
|
前端开发 JavaScript
Promise 详解
Promise 详解
63 0
|
11月前
|
前端开发
Promise
Promise
57 1
|
前端开发
什么是promise,解决了什么
什么是promise,解决了什么
153 0
|
前端开发 JavaScript
深入理解Promise
深入理解Promise
89 0
|
前端开发 数据库
promise的介绍
promise的介绍
106 0