iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在Javascript中实现异步等待
  • 491
分享到

怎么在Javascript中实现异步等待

2023-06-15 04:06:50 491人浏览 安东尼
摘要

本篇文章给大家分享的是有关怎么在javascript中实现异步等待,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。async/await 是javascript中的一种模式,可使

本篇文章给大家分享的是有关怎么在javascript中实现异步等待,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

async/await 是javascript中的一种模式,可使您的代码以同步方式执行,但又不影响javascript的异步行为。

定义异步功能

要定义一个异步函数,您所要做的只是在函数定义之前添加一个async关键字。

// async function always returns a promiseasync function greet() {  return "hello";}

轻松自在!?。在函数名称前使用async关键字

使该函数返回一个承诺。

函数返回时解析。

抛出错误时最终拒绝。

这意味着您每次要创建一个Promise时都不需要声明返回Promise.new()。

为了证明异步函数返回了一个Promise,我们可以快速附加一个then块以打印其值。

async function greet() {  return "Hello from an async function"}greet().then(message => console.log(message));//Hello from an async function

使用等待和执行异步功能

不冷静,我们可以做的then(),并catch()在一个async功能?但这不是异步async函数的真正功能,函数的真正潜力在于await语句。

await 使函数以同步方式执行,同时将控件保持在该行中,直到等待方法完成其执行。

async function greet() {  return "Hello from an async function"}async function execute() {  const message = await greet();  console.log(message)}

这是我们需要记住的一些经验法则。

?等待只能在异步函数内使用

async如果我们在函数内部使用await,则必须声明一个函数,反之则不然。

让我这样说。如果await在方法内部使用语句,则该方法必须是async方法,否则编译器会大吼大叫。

async function greet() {  return "Hello from an async function";}function execute() {//this function must be async  const message = await greet();  console.log(message)}

但是声明一个函数async并不一定意味着我们将始终await在其内部使用它。这greet()是一个async方法,但是await里面没有任何语句。

wait当调用函数,返回promise或为异步函数时,await才有意义

//not an async functionfunction greet() { return "Hello from an async function";}async function execute() {  const message = await greet();  console.log(message); //Hello from an async function}

尽管代码的工作原理与上一代码完全相同,但是await对synchronous函数进行操作没有任何意义。我想知道您对此有何想法?

使用await的一个重要方面是它阻塞了下一行代码的执行,直到执行await块为止。

const asyncGreet = () => new Promise(resolve => setTimeout(resolve, 2000));(async function execute() {  console.log("before executing");  await asyncGreet(); //blocks execution here  // ? executed once await is finished  console.log("I will be executed after 2000ms");})();

现在您必须怀疑是否正在等待使代码同步,为什么我们要使用它呢?nodeJ或浏览器Javascript是单线程环境,一次执行一项任务,由于它们的异步行为而被广泛使用,而我们正在失去这些行为。那有什么意义呢?

是的,您是对的,但是如果您在大多数情况下都观察到,我们需要执行与他人有关的任务。

async function subscribeToNewsLetter() {  const user  = await findUser(id);  //?methods need user email to execute  await subscribe(user.email)  await sendNotification(user.email)}

没错 但是互不相关的代码呢?好吧,还有一个替代方法,即(Promise.all)。

const asyncGreet = (name) =>  new Promise((resolve) => setTimeout(resolve(`Hello ${name}`), 2000));const names = ['john', 'jane', 'david'];(async function() {  const greetingPromises = names.map(name => asyncGreet(name));  console.log(await Promise.all(greetingPromises));})();

我知道上面的代码是一个人为的示例,在这里重要的是我们正在利用的力量Promise.all来执行所有的诺言

处理错误Async/Await。

使用async / await处理错误非常容易,我们可以使用我们的老朋友try / catch块来实现这一点。

async function subscribeToNewsLetter() {  try {    const user  = await findUser(id);    await subscribe(user.email)    await sendNotification(user.email)  } catch(err) {    //handle error  }}

还有另一个版本,我们可以将catch处理程序直接附加到await块。我个人不使用它,但是如果您愿意,可以尝试一下。

  await asyncGreet().catch(err => console.log(err);

2倍的可读性,易于调试

以下代码使用Promise通过id查找用户,分配配置文件信息,然后查找用户的订阅。

function getUser(id, profile) {  return new Promise((resolve, reject) => {    User      .find(id)      .then((user) => {        if(_.isEmpty(user)) return {};        user.profile = profile;        return user;      })      .then((user) => Subscription.find(user.id))      .then(subscription => {        if(_.isEmpty(subscription)) {          user.subscription = null;        } else {          user.subscription = subscription;        }        return resolve(user)      })      .catch(err => reject(err))  })}

上面的代码工作完全正常,但我们肯定可以使其更具可读性,简洁,易于调试与async/ await。让我们去吧。

async function getUser(id, profile) {  try {    const user = await User.find(id);    if(_.isEmpty(user)) return {};    user.profile = profile;    const subscription = await Subscription.find(user.id);    user.subscription = subscription    return user;  } catch(err) {    console.log(err);  }}

回调和Async/Await是敌人

正如我们在前面的示例中已经看到的那样,promise与async/一起使用非常好await。任何返回promise的函数都可以与await语句一起使用。

但是当涉及到回调时,情况恰恰相反,回调不能直接与async/一起使用await,必须将它们转换为Promise。

让我们考虑以下函数,该函数异步测试值是否为偶数(引发错误)。

function asyncEven(id, cb){  setTimeout(() => {    const even = id%2 === 0;    if (even) return cb(null, "even");    else return cb("not even");  }, 2000);}

我们知道在回调中不允许使用await,但是仍然尝试一下。

(async function() {  //?? Wrong way  const even = await asyncEven(2);  console.log("isEven ", even); //undefined})();

您一定在想,我们没有附加一个回调,这就是它打印的原因undefined。

让我们附加一个回调,这是很奇怪的,但是让我们有耐心。

(async function() {  //this is also wrong ??  const even = await asyncEven(2, (err, data) => { console.log("inside await on callback", err, data)});  console.log("isEven ", even);})();

似乎调用了回调,并且我们还从asyncEven函数中获取了值。没错,但这仍然是错误的方法。

await对回调没有影响。这类似于在同步功能上进行等待。

那为什么它返回undefined呢?这是个好问题。这是异步编程的默认性质。该setTimeout的功能是一个回调返回通过回调值2000毫秒之后,同时,控制开始执行的下一行代码,并且它达到的功能,这就是为什么我们得到的最终未定义。

那么解决方案是什么?很简单 将asyncEven功能变为承诺并await像冠军一样使用。

function asyncEven(id,) {  return new Promise((resolve, reject) => {    setTimeout(() => {      const even = id%2 === 0;      if (even) return resolve("even");      else return reject("not even");    }, 2000);  })}(async function() {  // waits for the execution  const even = await asyncEven(2);  console.log("iseven ", even);})();

ForEach不适合与 Async/Await

如果我们将ForEach循环与一起使用,则可能会有副作用async/await。考虑以下示例,console.log此处的语句不等待await

greet(name)。async function greet(name) { return Promise.resolve(`Hello ${name}, how are you ?`);}(function() {  console.log("before printing names");  const names = ['john', 'jane', 'joe'];  names.forEach(async (name) => {   //does not wait here    console.log(await greet(name));  });  console.log("after printing names");})();

不仅仅是语法糖

到目前为止,我们只知道这async/await使我们的代码更具可读性,调试友好性,并且有人说这是javascript promise的语法糖。实际上,它不只是语法糖。

// promiseasync1().then(x => asyncTwo(x)).then(y => asyncThree(y))//other statementconsole.log("hello")//async awaitx = await async1();y = await asyncTwo(x);await asyncThree(y);

await暂停当前函数的执行,而promise继续执行当前函数,将值添加到中then()。这两种执行程序的方式之间存在显着差异。

让我解释一下,考虑诺言版本,如果asyncTwo()或asyncThree()在执行任务时抛出异步错误,它将包含async1()在堆栈跟踪中吗?

这里的promise不会暂停当前函数的执行,当asyncTwo解析或拒绝时,上下文不在promise语句之内。因此,理想情况下,它不能包含asyncOne在堆栈跟踪中。但是由于使用了V8引擎,它在这里做了一些神奇的工作,通过asyncOne()提前引用以便包含asyncOne()在上下文中。但这不是免费的。捕获堆栈跟踪需要花费时间(即降低性能)。存储这些堆栈跟踪需要内存。

async/await在性能方面,这是拍子承诺的地方,因为当前功能的执行将暂停,直到等待功能完成为止,因此我们已经对该功能有了参考。

JavaScript的作用是什么

1、能够嵌入动态文本于html页面。2、对浏览器事件做出响应。3、读写HTML元素。4、在数据被提交到服务器之前验证数据。5、检测访客的浏览器信息。6、控制cookies,包括创建和修改等。7、基于node.js技术进行服务器端编程。

以上就是怎么在Javascript中实现异步等待,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: 怎么在Javascript中实现异步等待

本文链接: https://www.lsjlt.com/news/277680.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Javascript中实现异步等待
    本篇文章给大家分享的是有关怎么在Javascript中实现异步等待,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。async/await 是javascript中的一种模式,可使...
    99+
    2023-06-15
  • 怎么在JavaScript中实现休眠或等待
    这篇文章将为大家详细讲解有关怎么在JavaScript中实现休眠或等待,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JavaScript有什么特点1、js属于一种解释性脚本语言;2、在绝大多...
    99+
    2023-06-14
  • Javascript中异步等待的深入理解
    在本文中,我们将探讨async/await对于每个Javascript开发人员来说,异步编程的首选工具。如果您不熟悉javascript,请不要担心,本文将帮助您async/awai...
    99+
    2024-04-02
  • 怎么在JavaScript中实现同步和异步
    本篇文章为大家展示了怎么在JavaScript中实现同步和异步,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点击,给用户提供更好的...
    99+
    2023-06-14
  • Python异步等待任务怎么使用
    今天小编给大家分享一下Python异步等待任务怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正文我们可以通过 asy...
    99+
    2023-07-05
  • 如何在javascript中实现异步
    本篇文章给大家分享的是有关如何在javascript中实现异步,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。方法:1、利用setTimeout;2、利用setImmediate...
    99+
    2023-06-15
  • javascript怎么实现异步
    JavaScript是一门常用的编程语言,被广泛应用于web开发、游戏开发等领域。在JavaScript编程中,异步编程是一项重要的技术,它能够提高程序的性能和响应速度。那么,JavaScript怎样实现异步编程呢?本篇文章将从以下方面进行...
    99+
    2023-05-20
  • java接口异步不等待问题怎么解决
    在Java中,可以使用多线程和回调函数来解决接口异步不等待的问题。 一种常见的解决方法是使用线程池和Future对象。首先,将接口的...
    99+
    2023-10-24
    java
  • JavaScript中怎么利用sleep函数实现休眠或等待功能
    JavaScript中怎么利用sleep函数实现休眠或等待功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Ja使JavaSc...
    99+
    2024-04-02
  • Python异步怎么使用等待有时间限制协程
    本文小编为大家详细介绍“Python异步怎么使用等待有时间限制协程”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python异步怎么使用等待有时间限制协程”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。我们可以使...
    99+
    2023-07-05
  • 怎么实现JavaScript异步回调
    这篇文章主要讲解了“怎么实现JavaScript异步回调”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现JavaScript异步回调”吧!什么是异步回调?异步回调是指在执行一个任务时,...
    99+
    2023-07-06
  • JavaScript中怎么实现异步图像上传
    JavaScript中怎么实现异步图像上传,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用的代码此代码使用VanillaJS编写,不使用...
    99+
    2024-04-02
  • FutureTask怎么实现最大等待时间
    这篇文章主要介绍了FutureTask怎么实现最大等待时间的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇FutureTask怎么实现最大等待时间文章都会有所收获,下面我们一起来看看吧。预备知识Java 线程挂起...
    99+
    2023-07-05
  • redis中RedissonLock如何实现等待锁
    今天就跟大家聊聊有关redis中RedissonLock如何实现等待锁,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前言经常会有到这样的需求,就是在一个查询接口,第一次查询的时候,如...
    99+
    2023-06-25
  • java中的线程怎么实现等待与通知
    这篇文章给大家介绍java中的线程怎么实现等待与通知,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。关于等待/通知,要记住的关键点是:必须从同步环境内调用wait()、notify()、notifyAll()方法。线程不...
    99+
    2023-05-31
    java 线程 ava
  • css3缓冲和等待效果怎么实现
    这篇文章主要介绍“css3缓冲和等待效果怎么实现”,在日常操作中,相信很多人在css3缓冲和等待效果怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css3缓冲和等待效...
    99+
    2024-04-02
  • 怎么在javascript中异步回调函数
    这篇文章将为大家详细讲解有关怎么在javascript中异步回调函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、说明JavaScript代码本质上总是阻塞的。但是这种阻塞性使我们无法在...
    99+
    2023-06-15
  • JavaScript函数等待Await语法怎么用
    这篇文章主要介绍“JavaScript函数等待Await语法怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript函数等待Await语法怎么用”文...
    99+
    2024-04-02
  • JavaScript单线程和异步怎么实现
    这篇“JavaScript单线程和异步怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2024-04-02
  • ajax中怎么实现同步异步
    ajax中怎么实现同步异步,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。$("#btn_saveFWSB"...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作