Javascript中的async函数详解

Javascript中的async函数详解

Introduction

在Javascript中,async函数是一个让我们可以使用异步的方法来执行本来以同步方式执行的代码的函数。

它使我们能够避免回调地狱并轻松处理异步代码的结果。在本文中,我们将详细讲解async函数,并说明如何使用它们。

Async函数和Promise

ES6中带来了很多新的概念和特性,如Promise和async函数。因此需要先理解共同之处。

与Promise一样,async函数都是为了处理异步代码而存在的。但是,如下所示的代码可以将Promise和async函数区分开来。

// Promise
function getData() {
  return new Promise(resolve => setTimeout(() => resolve("data"), 1000));
}

// Async 函数
async function getData() {
  return await new Promise(resolve => setTimeout(() => resolve("data"), 1000));
}

async函数在其定义中包含关键字async,并且可以在函数体中使用await关键字。await会暂停代码执行并等待Promise的解决。它相当于Promise的then()

Async函数返回值

async函数始终返回一个Promise对象。这样,在await操作符出现的位置处将暂停执行,直到Promise被解决。当Promise解决后,函数将以解决时的值恢复执行。

async function getData() {
  return await new Promise(resolve => setTimeout(() => resolve("data"), 1000));
}

getData().then(data => console.log(data)); // "data"

在上面的示例中,我们定义了一个名为getData的async函数。该函数返回一个Promise对象,该Promise对象在1秒后将解决,值为"data"

我们通过调用getData()方法并使用.then()来解决这个Promise。然后我们调用console.log()以将结果打印到控制台。

Async函数的错误处理

我们可以使用try-catch语句来捕获async函数中的错误。

async function getData() {
  throw new Error("Error: Oops!");
}

try {
  getData();
} catch (err) {
  console.log(err);
}

在上面的示例中,我们定义一个名为getData的async函数。该函数在执行期间抛出一个错误。然后,我们尝试调用该函数并使用try-catch语句捕获错误。

Async函数和多个Promises

在async函数中,我们可以同时运行多个Promise。

async function getData() {
  const data1 = await new Promise(resolve => setTimeout(() => resolve("data 1"), 1000));
  const data2 = await new Promise(resolve => setTimeout(() => resolve("data 2"), 1000));

  return [data1, data2];
}

getData().then(data => console.log(data)); // ["data 1", "data 2"]

在上面的示例中,我们定义getData函数。该函数同时运行两个Promise并等待它们的解决。然后,函数返回一个数组,该数组包含解决的Promise的结果。

我们通过调用getData()方法并使用.then()来解决这个Promise。我们调用console.log()以将结果打印到控制台。

Async函数和await

async/await实现了从Promise回到简单同步代码的转变。

async function getData() {
  const data = await new Promise(resolve => setTimeout(() => resolve("data"), 1000));
  console.log(data);
  return data;
}

console.log("Before");
getData();
console.log("After");

在上面的示例中,我们定义了一个名为getData的async函数。该函数等待Promise解决并输出打印。然后我们在getData()后立即输出After。此输出在异步代码之前,因为async函数返回一个Promise并在后台运行,不会阻塞代码执行。

Async函数和处理具有并发限制的多个任务

async函数允许我们以保留并发控制的方式运行多个任务。通过同时处理Promise并遍历结果,然后通过.map()并设置Promise.all(),可以在有多个Promise的情况下保留延迟的顺序同时使得延迟彼此无关。

async function orderParallel(fnList, limit) {
  let running = 0;
  let results = [];
  let index = 0;

  function run(fn, fnIndex) {
    running++;
    fn().then(result => {
      results[fnIndex] = result;
      running--;
      runAll();
    });
  }

  function runAll() {
    while (running < limit && index < fnList.length) {
      const fn = fnList[index];
      run(fn, index++);
    }
    if (running === 0 && index === fnList.length) {
      console.log(results);
      return results;
    }
  }

  return await runAll();
}

function delay(time) {
  return new Promise(resolve => setTimeout(resolve, time));
}

const delays = [1000, 2000, 3000, 4000];
const promises = delays.map(delayTime => () => delay(delayTime).then(() => delayTime));

orderParallel(promises, 2);

在上面的示例中,我们定义了一个名为orderParallel的async函数。该函数同时运行带有一个Promise列表的多个Promise,并避免最大并发的数量。使用一个遍历方法来完成这一点,我们设置的最大并发限制器是2。

通过delay函数模拟一个单独的,具有3000毫秒延迟的操作。在最后一个console.log()中,我们就是得到了一个长度为4的数组,其中的元素和delays数组中的元素一一对应,并且在指定的延迟后输出。

Conclusion

在Javascript中,async函数是一个让我们可以使用异步的方法来执行本来以同步方式执行的代码的函数。在ES6中引入了Async函数,它如Promise一样帮助我们处理异步代码。然而,Async提供了一种简单的方式来书写异步代码,以避免回调地狱。我们也讲解了async函数的错误处理、返回和使用示例,并展示了一些进一步有用的示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript中的async函数详解 - Python技术站

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

相关文章

  • JavaScript使用localStorage存储数据

    以下是使用localStorage存储数据的完整攻略。 什么是localStorage? localStorage是一种客户端存储数据的方式,它可以在客户端本地存储数据,是一个只有浏览器端可以访问的本地存储器。localStorage可以使网页在下一次访问时获取我们之前保存的数据。 localStorage的使用步骤 1. 存储数据 在JavaScript中…

    JavaScript 2023年6月11日
    00
  • JavaScript代码模拟鼠标自动点击事件示例

    针对“JavaScript代码模拟鼠标自动点击事件”这个话题,我会给出详细的攻略,包含以下内容: 点击事件基础知识介绍 JavaScript 模拟鼠标自动点击事件的方式 示例说明 1.点击事件基础知识介绍 在 web 开发中,点击事件是比较常见的交互行为,可以使用鼠标或者触摸屏等设备进行触发。在页面中,我们可以通过注册点击事件监听器来实现对点击事件的响应处理…

    JavaScript 2023年6月11日
    00
  • JavaScript将字符串转换为整数的方法

    JavaScript中将字符串转换成整数的方法有多种,以下是其中的四种方法。 1. parseFloat方法 parseFloat方法将字符串解析成浮点数,如果字符串开头部分可以解析成浮点数的话,就返回该浮点数,否则返回NaN。 let str = "1234.567"; let num = parseFloat(str); consol…

    JavaScript 2023年5月28日
    00
  • 详解Go-JWT-RESTful身份认证教程

    详解Go-JWT-RESTful身份认证教程 介绍 本文将详细介绍如何使用Go语言实现一套基于JWT(JSON Web Token)的RESTful身份认证系统。RESTful是一种基于HTTP协议、符合REST原则的接口设计风格,使用JWT进行身份认证和授权可以轻松实现API的状态无关性和安全性。 实现步骤 生成JWT Token 生成JWT Token是…

    JavaScript 2023年6月11日
    00
  • js本地图片预览实现代码

    下面是详细讲解 JavaScript 实现本地图片预览的完整攻略。 1. 通过 <input type=”file”> 获取图片原始信息 要在页面中实现本地图片预览的功能,首先需要在 HTML 中添加一个带有 type=”file” 属性的 <input> 元素,用于获取用户选择的文件信息。 <input type="…

    JavaScript 2023年6月11日
    00
  • jquery遍历json对象集合详解

    现在我来详细讲解一下“jQuery遍历JSON对象集合详解”的完整攻略。 1. 简介 在前端开发中,经常需要使用JSON数据格式来传输和存储数据。而jQuery是一个非常流行的JavaScript库,提供了丰富的API来处理JSON数据。本文将详细介绍如何使用jQuery遍历JSON对象集合,以及如何使用jQuery处理JSON数据。 2. 遍历JSON对象…

    JavaScript 2023年5月27日
    00
  • 简单谈谈原生js的math对象

    当我们需要进行数学运算时,原生JavaScript提供了一个内置的Math对象,它提供了许多可用于进行常见数学运算和其他通用任务的方法。 获取随机数 我们可以使用Math对象的random()方法获取随机数。它将返回一个0到1之间的随机小数。 const randomNum = Math.random(); console.log(randomNum); /…

    JavaScript 2023年6月10日
    00
  • 突袭HTML5之Javascript API扩展3—本地存储全新体验

    突袭HTML5之Javascript API扩展3—本地存储全新体验 什么是本地存储 本地存储是 HTML5 新增的一个功能,可以让我们在客户端本地浏览器中存储数据,而无需借助服务器实现存储,该技术包含 localStorage 和 sessionStorage 两种技术。 localStorage 和 sessionStorage 的不同之处在于 loca…

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