Javascript中的async函数详解

yizhihongxing

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日

相关文章

  • js中动态创建json,动态为json添加属性、属性值的实例

    让我们来详细讲解一下JS中动态创建JSON、动态为JSON添加属性、属性值的实例。 一、什么是JSON JSON,全称为JavaScript Object Notation,是一种结构化的数据格式。它以文本的形式表示数据,比XML更加轻量级,也更容易解析。JSON由键值对构成,键值对之间用逗号分隔,最外层使用花括号{}。 JSON的键必须是字符串类型,值可以…

    JavaScript 2023年5月27日
    00
  • Js 时间间隔计算的函数(间隔天数)

    下面我来详细讲解“Js 时间间隔计算的函数(间隔天数)”的完整攻略。 1. 需求分析 首先,我们需要明确这个函数的具体需求。根据题目,我们需要实现一个函数来计算两个日期之间的间隔天数。例如,对于输入的日期字符串 “2021-01-01” 和 “2021-01-05″,函数应该返回 4。 2. 时间格式转换 首先,我们需要将日期字符串转换成 JavaScrip…

    JavaScript 2023年5月27日
    00
  • JavaScript ES2019中的8个新特性详解

    下面是对 “JavaScript ES2019中的8个新特性详解” 的完整攻略。 简介 ES2019是JavaScript的最新版本,主要为了增强语言的功能和特性。本文将对ES2019中的8个新特性进行详细的讲解。 新特性 1. Array.Flat() Array.Flat() 方法将多维数组简化为一维数组。这个方法不会改变原来的数组,而是返回一个新的一维…

    JavaScript 2023年5月27日
    00
  • javascript学习笔记(一) 在html中使用javascript

    关于“javascript学习笔记(一) 在html中使用javascript”的完整攻略,可以分为以下几个部分: 一、为什么要在html中使用javascript 在传统的网页设计中,html主要负责网页的结构和内容,而样式和特效则需要使用css和jquery等技术实现。而javascript则是一门非常重要的网页编程语言,其功能强大,可以实现很多与用户交…

    JavaScript 2023年6月10日
    00
  • JS实现纸牌发牌动画

    下面是JS实现纸牌发牌动画的完整攻略。 1. 准备工作 在HTML文件中引入相关的CSS和JS文件,其中CSS文件用于样式调整,JS文件则是执行动画功能的核心代码。可以使用jQuery或其他JS库来辅助实现。 2. 创建纸牌效果 2.1. 创建纸牌 首先,需要准备纸牌的图片素材,可以使用Photoshop或其他工具创建。 接着,在HTML文件中创建纸牌的元素…

    JavaScript 2023年6月10日
    00
  • 用JS做的简单的可折叠的两级树形菜单

    下面我将详细讲解使用JS实现一个简单的可折叠两级树形菜单的攻略。 准备工作 首先,我们需要准备一些基本的html和css代码,用于渲染出菜单的样式和结构。下面是一个简单的示例结构: <div class="menu"> <ul> <li><a href="#">菜单1&l…

    JavaScript 2023年6月11日
    00
  • javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)

    JavaScript高级程序设计第二版第十二章主要讲解了事件的相关知识点,其中包括事件的定义方式、事件处理程序、事件流、事件对象、跨浏览器问题的处理等内容。本章提供了一些实用的跨浏览器检测方法,以保证代码在各个浏览器平台下能够正常工作。下面是本章的要点总结: 事件处理程序 常见的事件处理程序有两种定义方式: HTML事件处理程序:直接将事件处理程序添加到HT…

    JavaScript 2023年5月27日
    00
  • js获取iframe中的window对象的实现方法

    获取iframe中的window对象是我们在进行Web前端开发中经常需要面对的问题。这里提供两种方法来获取iframe中的window对象。 方法一:使用iframe元素的contentWindow属性 我们可以使用iframe元素的contentWindow属性来获取iframe中的window对象。该属性返回对iframe窗口/框架的 window 对象…

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