iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Node.js中async和await关键字如何使用
  • 474
分享到

Node.js中async和await关键字如何使用

2023-07-02 15:07:51 474人浏览 薄情痞子
摘要

本篇内容主要讲解“node.js中async和await关键字如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“node.js中async和await关键字如何使用”吧!async 和 aw

本篇内容主要讲解“node.js中async和await关键字如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习node.js中async和await关键字如何使用”吧!

async 和 await 关键字

async 和 await 是 ES2017 中提出来的,async 和 await 两个关键字的出现,简化的 Promise 的使用。

async 关键字

async关键字使用比较简单,所以 async 的使用注意以下三点即可 :

  • async 用于修饰一个 function

  • async 修饰的函数,总是返回一个 Promise 对象

  • 函数内的所有值,将自动包装在 resolved 的 promise 中

// async 用于修饰一个 function//     1. async 修饰的函数,总是返回一个 Promise 对象//     2. 函数的返回值,将自动包装在 resolve 的 promise 中// 1. async 修饰的函数,总是返回一个 Promise 对象async function fn() {    // 2. 函数的返回值,将自动包装在 resolve 的 promise 中    return '哈哈哈';}// 以后看一下博客文章之类的东西,里面会有一些变量使用 :foo 和 bar , 无意义;const foo = fn();console.log(foo);foo.then(res => {    console.log(res);});// 注意: async修饰的函数被称为异步函数,可他不是异步执行;console.log('我是最后一行代码');

await关键字

await关键字比较繁琐,注意点比较多。首先,await 只能出现在 async 函数内,await 让 JS 引擎等待直到promise完成并返回结果,语法:

let value = await promise对象; // 等待promise对象的结果,然后将结果赋值给 value

由于await需要等待promise执行完毕,所以 await会 暂停函数的执行,但不会影响其他同步任务。

所以,await总结如下四点:

  • await只能出现在异步函数中!

  • await能停止代码执行,让后面的同步代码,先执行;

  • await后面跟随的是一个promise对象;

  • await返回的是: Promise对象中的then()中的回调函数中的参数res;

// 定义一个方法,为的就是返回一个 Promise 对象,让下面的await使用;async function getPromise() {    return '哈哈哈';}console.log(1);// 1.await只能出现在async修饰的函数中!async function fn() {    console.log(2);    // 2.await后面跟随的是一个promise对象;    // 3.await返回的是: Promise对象中的then()中的回调函数中的参数res;    const str = await getPromise();    console.log(str);    // 4.await能停止代码执行,让后面的同步代码,先执行;    console.log(3);}// 调用fn();console.log(4);// // 以前用法: // axiOS().then(res => {//     res.data.map()// });// // 以后用法: // async function name() {//     let res = await axios();//     res.data.map();// }

async 和 await 解决回调地狱

// async 和 await 解决回调地狱也要用到 then-fs ,因为他直接返回 Promise 对象;// 导入 then-fsimport thenFs from 'then-fs';// await 一定要出现在异步函数中async function fn() {    let str1 = await thenFs.readFile('./txt/a.txt', 'utf8');    console.log(str1);    let str2 = await thenFs.readFile('./txt/b.txt', 'utf8');    console.log(str2);    let str3 = await thenFs.readFile('./txt/c.txt', 'utf8');    console.log(str3);}// 调用函数fn();

JS执行机制(事件循环)

  • js代码开始执行后,主线程执行栈中会把任务分为两类.

  • 一类是同步任务, 一类是异步任务; 主线程执行栈优先执行同步任务,

  • 异步任务会被放入特定的处理程序中,满足条件后,被放到消息(任务/事件)队列中,

  • 主线程执行栈中所有的同步任务执行完毕之后,通过事件循环去消息(任务/事件)队列中,

  • 挑选优先满足条件的程序,放入主线程执行栈中执行。事件循环,周而复始,一直执行。

微任务和宏任务

在ES3 以及以前的版本中,javascript本身没有发起异步请求的能力,也就没有微任务的存在。在ES5之后,JavaScript引入了Promise,这样,不需要浏览器,JavaScript引擎自身也能够发起异步任务了。  Tick会触发浏览器渲染,Promise不会触发,所以更加轻量级,多使用;

宏任务

(Macro)task,可以理解是每次执行栈执行的代码就是一个宏任务

  • 主线程上的执行栈中所有的代码块

  • setTimeout

  • setInterval

  • ajax

  • 事件

微任务

微任务(microtask)是宏任务中的一个部分,它的执行时机是在同步代码执行之后,下一个宏任务执行之前。

总结起来,微任务有:

  • Promise.then

  • process.nextTick(Node.js 环境)

宏任务和微任务执行机制

JS优先执行同步任务,然后执行微任务,最后执行宏任务。

总结:Promise中的then()比大部分异步代码,优先执行!

// 结论: 如果同一时间既有宏任务又有微任务触发,那么优先执行微任务;//     宏任务是宿主发起的会触发重构,比较浪费资源,后执行;//     微任务是js解释器发起的不会触发重构,比较节省资源,先执行;// 宏任务setTimeout(() => {    //执行后 回调一个宏事件    console.log('1')}, 0)// 同步代码console.log('2');// 同步代码new Promise((resolve) => {    console.log('3');    resolve()// 微任务}).then(() => {    console.log('4');// 微任务}).then(()=>{    console.log('5')})// 同步代码console.log('6')// 2  3   6   4   5   1

到此,相信大家对“Node.js中async和await关键字如何使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Node.js中async和await关键字如何使用

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

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

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

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

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-15
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-15
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-15
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-15
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-15
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-15
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-15
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-15
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-15
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-15
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作