ES6中的Promise对象与async和await方法详解

yizhihongxing

ES6中的Promise对象与async和await方法详解

在ES6之前,JavaScript的异步编程需要使用回调函数,这种方式常常导致代码难以阅读和维护。ES6引入Promise对象和async/await方法,使得异步编程更加易于理解和控制。

Promise对象

Promise对象是ES6提供的一种异步编程的解决方案,是一个代表一个异步操作的最终结果的对象。Promise对象有3个状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。

创建Promise对象

通过Promise构造函数可以创建新的Promise对象,它接受一个函数作为参数,这个函数会立即执行,并接受两个参数resolvereject

const promise = new Promise(function(resolve, reject) {
  // 异步操作
  setTimeout(function() {
    if (/* 操作成功 */) {
      resolve("操作成功");
    } else {
      reject(new Error("操作失败"));
    }
  }, 1000);
});

Promise对象的方法

  • then(onFulfilled, onRejected): 当Promise对象的状态变成fulfilled时调用onFulfilled函数,当状态变成rejected时调用onRejected函数。这个方法返回一个新的Promise对象。
promise
  .then(function(value) {
    console.log(value); // "操作成功"
  }, function(error) {
    console.log(error); // Error: "操作失败"
  });
  • catch(onRejected): 相当于then(null, onRejected),只捕捉rejected状态的Promise对象。如果Promise对象的状态是fulfilled,则会跳过catch方法,直接执行后面的then方法。
promise
  .then(function(value) {
    console.log(value);
  })
  .catch(function(error) {
    console.log(error); // Error: "操作失败"
  });

Promise.all方法

Promise.all方法可以同时执行多个Promise对象,等待所有Promise对象都显式为fulfilled状态时返回一个新的Promise对象。新的Promise对象的resolved值为一个数组,数组中的元素为每个Promise对象的resolved值,按照传入Promise.all方法的数组的顺序排列。

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

Promise.all([promise1, promise2, promise3])
  .then(function(values) {
    console.log(values); // [1, 2, 3]
  });

async/await方法

async函数是ES7中引入的一种新的异步编程机制,它可以让我们更好的写出异步代码,终止了JavaScript里面多层回调的写法。awaitasync函数的一部分,它可以在线性代码的基础上写出异步的代码,await后面跟着的是一个返回Promise对象的表达式,await会暂停async函数的执行,等待Promise对象的resolved值。

async函数

async函数返回一个Promise对象,可以使用Promise的then方法添加回调函数。

async function asyncFunc() {
  // 异步操作
  return "异步操作完成";
}

asyncFunc().then(function(value) {
  console.log(value); // "异步操作完成"
});

await表达式

await表达式会暂停async函数的执行,等待Promise对象的resolved值,并使用其resolved值作为表达式的值。如果Promise对象rejected,则抛出异常。

async function asyncFunc() {
  // 异步操作
  const resolvedValue = await Promise.resolve("异步操作完成");
  console.log(resolvedValue); // "异步操作完成"
}

asyncFunc();

错误处理

在async/await函数内部使用try...catch语句捕获异步操作中的错误。

async function asyncFunc() {
  try {
    // 异步操作
    const resolvedValue = await Promise.reject(new Error("异步操作失败"));
  } catch (error) {
    console.log(error); // Error: "异步操作失败"
  }
}

asyncFunc();

示例1

下面是一个将使用异步API得到的数组中的所有元素的字符串长度置于数组中并返回的函数。

async function getStringLengthsFromArray() {
  try {
    const array = await getArrayAsync();
    const stringLengths = array.map(function(str) {
      return str.length;
    });
    return stringLengths;
  } catch (error) {
    console.log(error);
  }
}

function getArrayAsync() {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      resolve(["apple", "banana", "orange"]);
    }, 1000);
  });
}

getStringLengthsFromArray()
  .then(function(stringLengths) {
    console.log(stringLengths); // [5, 6, 6]
  });

示例2

下面是一个使用asyncawait函数实现的得到用户Github信息的例子:

async function getUserInfo(username) {
  try {
    const userInfo = await fetch(`https://api.github.com/users/${username}`).then(function(response) {
      if (!response.ok) {
        throw new Error(response.statusText);
      }
      return response.json();
    });
    const repositories = await fetch(userInfo.repos_url).then(function(response) {
      if (!response.ok) {
        throw new Error(response.statusText);
      }
      return response.json();
    });
    userInfo.repositories = repositories;
    return userInfo;
  } catch (error) {
    console.log(error);
  }
}

getUserInfo("generalsimus")
  .then(function(userInfo) {
    console.log(userInfo.repositories); // Array[30]
  });

结束语

使用Promise对象和async/await方法可以使得异步编程更加清晰和易于维护。当然,在处理错误的时候也需要注意。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ES6中的Promise对象与async和await方法详解 - Python技术站

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

相关文章

  • javascript动画之圆形运动,环绕鼠标运动作小球

    JavaScript动画之圆形运动 在JavaScript中,通过使用CSS3的transform属性或canvas绘图API,可以实现圆形运动效果。接下来,我们以transform属性为例进行详细讲解。 示例1:物体沿圆形路径运动 首先,需要准备一个容器和一个要运动的物体。将其设置为圆形,如下所示: <div id="container&q…

    JavaScript 2023年6月10日
    00
  • JS实现的进制转换,浮点数相加,数字判断操作示例

    JS实现的进制转换攻略: 对于进制转换,JS提供了parseInt和toString方法。其中parseInt方法可将其他进制的数字转换为十进制,toString方法可将十进制数字转换为其他进制。 示例说明1:将十六进制数字转换为十进制 let hex = "3A"; let dec = parseInt(hex, 16); consol…

    JavaScript 2023年5月28日
    00
  • Javascript面向对象之四 继承

    Javascript面向对象之四 继承 在 Javascript 中,对象是通过原型 (prototype) 进行继承的。 原型链继承 原型链继承是最常见的继承方式。它的原理是通过把一个对象作为另一个对象的原型来实现继承。 示例1: function Animal(name) { this.name = name; } Animal.prototype.sa…

    JavaScript 2023年5月27日
    00
  • JavaScript正则表达式函数总结(常用)

    JavaScript正则表达式函数总结(常用) 正则表达式是用于处理字符串的强大工具,JavaScript内置了正则表达式对象RegExp,使用正则表达式可以快速而灵活地解析、匹配和替换字符串。 常用正则表达式函数 test() test()方法用于测试一个字符串是否匹配某个正则表达式,返回值为布尔类型,如果匹配成功,则返回true,否则返回false。 l…

    JavaScript 2023年5月27日
    00
  • javascript使用btoa和atob来进行Base64转码和解码

    JavaScript中使用btoa()和atob()可以进行Base64编码和解码。Base64编码是将二进制数据编码成ASCII字符串的过程,解码则是将已编码的ASCII字符串还原为原始的二进制数据。 btoa()方法 btoa()方法可以将一个字符串进行Base64编码。 语法 string btoa(string) 参数 string: 待编码的字符串…

    JavaScript 2023年5月19日
    00
  • 原生JS面向对象实现打砖块小游戏

    一、前言 打砖块小游戏是经典的游戏之一,其规则简单,玩法有趣且易上手。本篇攻略将带领大家使用原生JS面向对象的方式来实现打砖块小游戏。 二、需求分析 打砖块小游戏的基本需求如下: 游戏界面要有一个球、多个砖块和一个挡板,球碰到砖块或者挡板之后反弹。 球和挡板可以通过鼠标或者键盘来控制。 游戏结束条件:砖块被撞完或者球跌落屏幕下方。 三、实现步骤 Step 1…

    JavaScript 2023年6月10日
    00
  • JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例

    以下是“JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例”的完整攻略。 1. 实现思路 实现点击某区域以外时弹窗的弹出与关闭功能,通常需要使用到以下两个关键点: 给页面添加遮罩层:当弹窗弹出时,为了让用户无法操作页面中的其他内容,我们需要添加一个遮罩层来将其他内容覆盖住; 给遮罩层和弹窗添加事件监听:我们需要监听“点击遮罩层”和“点击弹窗中除关闭按钮…

    JavaScript 2023年6月10日
    00
  • ES6基础语法之对象介绍

    ES6基础语法之对象介绍 在ES6中,新的语法规范,对象展开操作符、对象方法、计算属性名以及内置Object属性等,在对象的定义与操作中起到了很大的作用。 对象基础 在ES6中,我们可以通过对象字面量的方式来创建一个对象,如下所示: let obj = { name: ‘张三’, age: 18, sex: ‘男’ }; ES6还引入了一个新的关键字let来…

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