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

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中return的作用

    深入理解 JavaScript 中 return 的作用 在 JavaScript 中,return 是一个非常重要的关键字,它可以终止函数的执行,并返回一个值。在函数中,有时候我们需要根据一些条件进行不同的处理,并最终返回一个值,这时候 return 就发挥了重要的作用。本攻略主要介绍 return 的用法及其注意事项。 基本用法 return 关键字后面…

    JavaScript 2023年6月10日
    00
  • 基于javascript的无缝滚动动画实现2

    针对”基于javascript的无缝滚动动画实现2″,我来给您详细讲解一下。 简介 无缝滚动动画是Web开发中较为常见的功能,通常用于实现图片、文字等大块内容的滚动展示。本攻略将介绍使用JavaScript实现无缝滚动动画的方法。 实现过程 本攻略实现的无缝滚动动画需要以下主要步骤: 创建HTML布局:需要创建一个固定大小的div容器,再将需要滚动展示的内容…

    JavaScript 2023年6月10日
    00
  • JS实现简单的九宫格抽奖

    JS实现简单的九宫格抽奖攻略 介绍 九宫格抽奖是一种常见的营销活动,可以在网站、微信公众号等平台进行。在本文中,我们将使用 JavaScript 实现一个简单的九宫格抽奖效果。 需求分析 在实现九宫格抽奖之前,我们需要确定需求。在此我们规定,用户点击抽奖按钮,九宫格开始转动。转动一段时间后,随机停止在一个格子上,弹出提示框告知用户是否中奖,并将中奖信息存入后…

    JavaScript 2023年6月11日
    00
  • H5实现仿flash效果的实现代码

    针对“H5实现仿flash效果的实现代码”,我将分为以下几个部分进行详细的讲解: 需求分析 技术架构选择 实现步骤 示例说明 1. 需求分析 我们需要实现仿flash的效果,即实现一个可滚动、可拖拽、可放大缩小的区域,这个区域中可以包含图片、文字、动画等各种元素。 2. 技术架构选择 在实现这个功能时,我们可以选择使用以下技术架构进行开发: HTML5 CS…

    JavaScript 2023年6月11日
    00
  • 分享AjaxPro或者Ajax实现机制

    分享AjaxPro或者Ajax实现机制的完整攻略可以分为以下几个部分: AjaxPro介绍 AjaxPro是一个能够帮助开发人员在使用Ajax时更加便捷的工具库。它能够自动地处理多个请求,避免多次发送请求造成的性能问题。同时,它也提供了更加直观、易懂的API接口,使得开发人员能够更加轻松地使用Ajax完成各种功能。 Ajax实现机制 Ajax的实现机制本质上…

    JavaScript 2023年6月11日
    00
  • java构造http请求的几种方式(附源码)

    我来为您详细讲解”Java构造HTTP请求的几种方式”。 1. 使用URLConnection发送HTTP请求 使用URLConnection可以方便的发送HTTP请求。下面是一个使用URLConnection发送get请求的示例代码: public static String sendGetRequest(String url) throws Except…

    JavaScript 2023年6月11日
    00
  • JavaScript动态添加列的方法

    JavaScript动态添加列是一种常见的网页开发需求,通常用于在表格或其他HTML元素中添加新列来展示数据。下面是实现该功能的完整攻略。 步骤一:选择目标表格 首先,我们需要在HTML中选择要添加列的表格元素。通常,我们可以使用document.getElementById()方法或document.querySelector()方法来获取表格元素的引用。…

    JavaScript 2023年6月11日
    00
  • setTimeout和setInterval的深入理解

    setTimeout和setInterval的深入理解 什么是setTimeout? setTimeout是JavaScript中的一个函数,用于在指定的毫秒数之后执行一段代码。setTimeout函数的语法如下: setTimeout(function, milliseconds, param1, param2, …) 参数说明: function:必…

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