深入学习JavaScript中的promise

yizhihongxing

深入学习 JavaScript 中的 Promise

什么是 Promise

Promise 是一种处理异步操作的机制。它将异步操作包装成一个对象,使得我们可以像同步操作一样进行编程。Promise 对象可以表示一个异步操作的“未来结果”,并且提供了一些方法来处理这个“未来结果”的返回值或者错误信息。

Promise 的状态

Promise 有 3 种状态:

  1. pending - 初始状态,不是 fulfilled 也不是 rejected。
  2. fulfilled - 意味着操作成功完成,返回了相应的值。
  3. rejected - 意味着操作失败,返回了相应的错误信息。

Promise 的基本用法

Promise 的基本用法包括 Promise 的创建、Promise 的 then 方法,以及 Promise 的 catch 方法。

Promise 的创建

const promise = new Promise((resolve, reject) => {
  // 异步操作
  const result = doSomething();
  if (result.success) {
    resolve(result.value);
  } else {
    reject(result.error);
  }
});

上面代码中,Promise 接受一个函数作为参数,这个函数被称为 Promise 的“执行函数”,它接受两个参数 resolve 和 reject。resolve 负责将 Promise 的状态从 pending 转变为 fulfilled,reject 负责将 Promise 的状态从 pending 转变为 rejected。

Promise 的 then 方法

promise.then(
  result => {
    console.log('操作成功:', result);
  },
  error => {
    console.log('操作失败:', error);
  }
);

then 方法接受两个参数:成功回调和失败回调。当 Promise 的状态变为 fulfilled 时,会执行成功回调,可将结果传递给该回调。当 Promise 的状态变为 rejected 时,会执行失败回调,可将错误信息传递给该回调。

Promise 的 catch 方法

promise.catch(error => {
  console.log('操作失败:', error);
});

catch 方法只接受一个参数:失败回调。有时候我们只关心 Promise 的失败情况,那么就可以使用 catch 方法来代替 then 方法中的第二个参数。

Promise 的高级用法

Promise.all 方法

const promise1 = Promise.resolve('Promise 1');
const promise2 = Promise.resolve('Promise 2');
const promise3 = Promise.resolve('Promise 3');

Promise.all([promise1, promise2, promise3]).then(results => {
  console.log(results);
});

Promise.all 方法接受一个 Promise 对象数组作为参数,返回一个新的 Promise 对象。当所有的 Promise 对象都成功执行时,Promise.all 返回的 Promise 对象的状态变为 fulfilled,并返回一个结果数组,数组中的元素是每一个 Promise 对象的返回结果。如果有任何一个 Promise 对象失败了,Promise.all 返回的 Promise 对象的状态变为 rejected 并返回第一个失败的 Promise 对象的错误信息。

Promise.race 方法

const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'Promise 1');
});
const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 1000, 'Promise 2');
});

Promise.race([promise1, promise2]).then(result => {
  console.log(result);
});

Promise.race 方法接受一个 Promise 对象数组作为参数,返回一个新的 Promise 对象。当有任何一个 Promise 对象状态变为 fulfilled 或者 rejected,Promise.race 方法就返回的 Promise 对象的状态就会跟随这个 Promise 对象的状态变化。如果第一个 Promise 对象成功执行,Promise.race 返回的 Promise 对象的状态变为 fulfilled 并返回该 Promise 对象的结果,如果第一个 Promise 对象执行失败,Promise.race 返回的 Promise 对象的状态变为 rejected 并返回该 Promise 对象的错误信息。

示例说明

示例1

下面是一个使用 Promise.all 方法的实际例子。假设有一个场景,需要插入一个订单数据到数据库,然后根据订单的邮寄地址发送一封邮件和生成一个 PDF 文件。这些操作都是异步的,我们可以使用 Promise 轻松地编写这个功能。

const insertOrderToDB = orderData => {
  return new Promise((resolve, reject) => {
    // 异步操作
    setTimeout(() => {
      const success = true;
      if (success) {
        resolve('订单数据插入成功');
      } else {
        reject('订单数据插入失败');
      }
    }, 500);
  });
};

const sendEmail = orderData => {
  return new Promise((resolve, reject) => {
    // 异步操作
    setTimeout(() => {
      const success = true;
      if (success) {
        resolve('邮件发送成功');
      } else {
        reject('邮件发送失败');
      }
    }, 500);
  });
};

const generatePdf = orderData => {
  return new Promise((resolve, reject) => {
    // 异步操作
    setTimeout(() => {
      const success = true;
      if (success) {
        resolve('PDF 文件生成成功');
      } else {
        reject('PDF 文件生成失败');
      }
    }, 500);
  });
};

const orderData = {
  orderId: '20210101',
  shippingAddress: 'Beijing',
  customerName: 'John Doe'
};

Promise.all([insertOrderToDB(orderData), sendEmail(orderData), generatePdf(orderData)])
  .then(results => {
    console.log('所有操作均已成功:', results);
  })
  .catch(error => {
    console.log('操作失败:', error);
  });

上面代码中,我们通过 Promise.all 将订单数据插入到数据库、发送邮件、生成 PDF 文件的操作并行执行,并在所有操作结束后,通过 then 方法处理结果。

示例2

下面是一个使用 Promise.race 方法的实际例子。假设有一个场景,需要调用多个接口查询同一组数据,但是这些接口的响应时间不一样,我们不希望等待时间过长才得到结果,可以使用 Promise.race 方法。

const queryDataFromAPI = url => {
  return new Promise((resolve, reject) => {
    // 异步操作
    setTimeout(() => {
      const success = url === 'api1';
      if (success) {
        resolve(`来自${url}的数据`);
      } else {
        reject(`来自${url}的数据查询失败`);
      }
    }, Math.random() * 1000 + 500);
  });
};

const urls = ['api1', 'api2', 'api3'];

Promise.race(urls.map(url => queryDataFromAPI(url)))
  .then(result => {
    console.log('第一个响应的接口返回的数据:', result);
  })
  .catch(error => {
    console.log('所有接口均未返回数据:', error);
  });

上面代码中,我们通过 Promise.race 调用多个接口查询数据,并在第一个接口返回数据后立即停止其它接口的查询,最终得到结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入学习JavaScript中的promise - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • JS的函数调用栈stack size的计算方法

    当JS代码执行过程中,函数的调用将会依次进入函数调用栈,函数执行结束后,结果将会被推出函数调用栈。函数调用栈有容量的限制,如果超出会导致“堆栈溢出”,因此需要了解JS函数调用栈stack size的计算方法。 JS函数调用栈的stack size计算方法如下: 找到当前正在调用的函数有多少个参数(包括默认参数和剩余参数) 每个参数占用一个内存空间,计算所有参…

    JavaScript 2023年6月11日
    00
  • 常常会用到的截取字符串substr()、substring()、slice()方法详解

    下面是关于常用的字符串截取方法 substr()、substring()、slice() 的详细讲解。 substr() 方法 substr() 方法用于截取一个字符串的部分内容,它接收两个参数,第一个参数是截取的起始位置,第二个参数是需要截取的字符个数。当第二个参数缺省时,则表示截取到字符串末尾。下面是一个例子: const str = "hel…

    JavaScript 2023年5月28日
    00
  • Element Alert警告的具体使用方法

    Element UI是一个基于Vue.js的桌面前端框架,提供了很多常用的UI组件。其中Element Alert警告组件用于提示用户操作的成功、失败和警告等结果。本文将详细讲解Element Alert警告组件的具体使用方法。 引入Alert组件 在使用Alert组件前,需要先引入Element UI: <link rel="stylesh…

    JavaScript 2023年6月11日
    00
  • JS字符串函数扩展代码

    JS字符串函数扩展代码可以让我们在字符串处理中更加轻松灵活。下面将详细讲解该功能的实现方法和使用技巧。 如何实现字符串函数扩展 JS提供了在String原型中扩展函数的方法,可以通过给String.prototype添加新的方法来实现字符串函数的扩展。比如,我们可以为String.prototype添加名为reverse的方法: String.prototy…

    JavaScript 2023年5月27日
    00
  • 把json格式的字符串转换成javascript对象或数组的方法总结

    让我来讲解一下“把json格式的字符串转换成javascript对象或数组的方法总结”。 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它由Douglas Crockford在2001年创造。JSON 采用完全独立于语言的文本格式,具有简洁明了、易于读写的特点,是广泛应用于Web应用程序之中的文本…

    JavaScript 2023年5月27日
    00
  • JavaScript高级 ES7-ES13 新特性详解

    JavaScript 高级 ES7-ES13 新特性详解 在这里,我们将介绍 JavaScript ES7 到 ES13 所引入的一些新特性。 1. ES7 新特性 1.1 includes 方法 includes() 方法可用于判断一个数组是否包含一个特定的值,并返回 true 或 false。这个方法在 ES7 中被正式引入,可以通过以下的方式来调用: …

    JavaScript 2023年6月10日
    00
  • VBS一键配置VOIP脚本代码

    1. 确定脚本的功能 在编写脚本代码之前,首先需要确定脚本的功能。在这个例子中,脚本的功能是“一键配置VOIP”,也就是帮助用户配置环境以便进行语音通话。具体的配置包括网络设置,软件安装等等。 2. 创建VBS脚本文件 创建一个新的文本文件,然后将文件后缀名改为“.vbs”来创建一个VBS脚本文件。接着,在该文件中编写代码。 3. 编写脚本代码 在脚本代码中…

    JavaScript 2023年6月11日
    00
  • javascript打印输出json实例

    让我来详细讲解一下“JavaScript 打印输出 JSON 实例”的完整攻略。 首先,我们需要了解 JSON 是什么。JSON 是一种轻量级的数据格式,其特点是易于阅读和编写。在 Web 开发中,常常使用 JSON 来传输数据。在 JavaScript 中,可以将一个 JSON 对象转换成字符串,也可以将一个字符串转换成 JSON 对象。 接着,我们需要了…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部