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日

相关文章

  • ASP.NET没有魔法_ASP.NET MVC 模型验证方法

    ASP.NET没有魔法_ASP.NET MVC 模型验证方法 什么是ASP.NET MVC模型验证? ASP.NET MVC模型验证是指在客户端输入数据后提交到服务器时,对数据进行校验的过程。在ASP.NET MVC中,模型验证是至关重要的,因为它可以确保数据的完整性和有效性,避免了潜在的错误。 ASP.NET MVC模型验证的实现方式 ASP.NET MV…

    JavaScript 2023年6月11日
    00
  • 现代 javscript 编程 资料第2/6页

    我们来详细解析“现代JavaScript编程资料第2/6页”的完整攻略吧。 背景介绍 这份资料是介绍现代 JavaScript 编程的,旨在帮助初学者快速入门并熟练掌握现代 JavaScript 的相关技术和特性。 攻略步骤 以下是学习该资料的详细攻略步骤: 1. 熟悉资料结构 该资料的第2/6页主要介绍了以下内容: ES6 模块化 Promises 迭代器…

    JavaScript 2023年6月10日
    00
  • 你可能不知道的JavaScript位运算符详解

    你可能不知道的JavaScript位运算符详解 介绍 在JavaScript中,除了常用的加减乘除运算符,还有一些位运算符。这些运算符可以对给定的数字进行二进制位操作。本文将为你详细讲解这些运算符。 位运算符分类 JavaScript中一共有7种位运算符,可以分为以下几类: 按位与运算符(&) 按位或运算符(|) 按位异或运算符(^) 左移运算符(&…

    JavaScript 2023年5月28日
    00
  • 使用JavaScript库还是自己写代码?

    使用JavaScript库还是自己写代码是一个经久不衰的话题。在制作网页时,我们经常要考虑是否使用现有的库或自己编写特定的代码。下面是一些指导思想,以帮助您做出明智的决定。 1. 考虑复杂性 当您需要实现的功能变得越来越复杂时,许多开发人员通常会使用现有的 JavaScript 库来解决问题。例如,为了让一个简单的动画运行,不需要将动画的起始位置和结束位置与…

    JavaScript 2023年6月11日
    00
  • 2021年值得向Python开发者推荐的VS Code扩展插件

    下面是详细讲解“2021年值得向Python开发者推荐的VS Code扩展插件”的完整攻略。 1. 简介 VS Code 是一款免费开源的轻量级编辑器,支持多种编程语言,Python 是其中之一。丰富的扩展插件使得 VS Code 更加强大,可以让开发者更加高效地编写 Python 代码。本攻略将介绍一些值得向 Python 开发者推荐的扩展插件。 2. 推…

    JavaScript 2023年5月28日
    00
  • 返回页面顶部top按钮通过锚点实现(自写)

    下面是”返回页面顶部top按钮通过锚点实现(自写)”的完整攻略: 什么是返回页面顶部top按钮和锚点 在一个网页中,如果页面内容很多,用户在滚动页面时需要不断的滑动鼠标或手指,有时非常的不方便。为了解决这个问题,我们通常会添加一个“返回页面顶部”的按钮,让用户一键回到页面的顶部。 而锚点是指通过HTML代码中的href属性,在同一页面内跳转到不同的锚点位置,…

    JavaScript 2023年6月11日
    00
  • javascript入门教程基础篇

    JavaScript入门教程基础篇攻略 什么是JavaScript JavaScript是一种脚本语言,通常用于网页的客户端编程。它可以直接嵌入到HTML代码中,并在页面上进行动态交互,例如弹出对话框、验证表单、改变样式等。 学习JavaScript前的准备 在学习JavaScript之前,需要掌握HTML和CSS基础知识,因为JavaScript通常用于操…

    JavaScript 2023年5月17日
    00
  • JavaScript中DOM和BOM原理详析

    JavaScript中DOM和BOM原理详析 什么是DOM? DOM(文档对象模型)是JavaScript操作网页的接口,它将网页文档看成一个树形结构,可以通过JavaScript来操作这个树形结构中的各个节点。HTML中的标签、文本和属性都被表示为树中的节点,节点与节点之间有父子和兄弟关系。 DOM接口 DOM提供了一系列的API,可以通过这些API对节点…

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