await原理 js_「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能

b2871beca5f7fa7b44c9eb758686121f.png

本周,Nodejs v14.3.0 发布。这个版本包括添加顶级 Await、REPL 增强等功能。

REPL 增强

通过自动补全改进对 REPL 的预览支持,例如,下图中当输入 process.ver 之后,不需要输入剩下的实际内容,它帮我们生成了自动补全的输入预览。

49397b34d48da5d2eb93a54797409975.png

顶级 Await 支持

不再需要更多的 "async await, async await..." 支持在异步函数之外使用 await 关键字。

REPL 环境下应用

在 REPL 环境下做了一个测试,似乎并没有正常工作,得到了一些错误,这是为什么呢?

eee2ac39c45a35d380e87d51f11ec673.png

根据规范,仅支持在 ES Modules 模块中可用,参考 tc39/proposal-top-level-awai

我们不能提供 “--input-type=module” 这样的标志到 REPL 环境, 这一次在 node 后加上标志 --experimental-repl-await 看以下示例,现在它可以正常工作了。

b64d0f715f0756e513b3fb1a7f055bb0.png

ES Modules 下应用

Nodejs 在版本 v13.2.0 取消了标记 --experimental-module 可以直接使用 ES Modules。

一种使用方式是文件后缀名使用 .mjs,另一种使用方式是还使用原来的 .js 文件,但是要设置 package.json 的 type=module,详情可以去官网查看 nodejs.org/api/esm.html

1. 创建 index.mjs

以下示例中我们使用 setTimeout 模拟了一个 sleep 函数,在指定的延迟时间下打印输出。

const sleep = (millisecond, value) => {  return new Promise(resolve => setTimeout(() => resolve(value), millisecond));};const val1 = await sleep(1000, 'Output hello after 1 second.');console.log(val1);const val2 = await sleep(2000, 'Output Nodejs after 1 second.');console.log(val2);

2. 运行 index.mjs

直接这样执行,仍然会得到一个错误,但是看最新发布的 v14.3.0 说明,也没有说明要提供什么标志,这一点产生了困惑。

Support for Top-Level Await

It's now possible to use the await keyword outside of async functions.

$ node index.mjs   file:///index.mjs:5const val1 = await sleep(1000, 'Output hello after 1 second.');             ^^^^^SyntaxError: Unexpected reserved word

在 Github issues Top-level await throws SyntaxError 上发现了一个同样的问题,解释了这个原因,在当前版本 v14.3.0 中运行时我们仍需要加上如下两个标志:

--experimental_top_level_await or --harmony_top_level_await

3. 再次运行 index.mjs

这一次运行结果是我们的期望值。

$ node --experimental_top_level_await index.mjsOutput hello after 1 second.Output Nodejs after 1 second.

Top-level await 的用途

上面介绍了 Top-level await 该如何使用,这里说下它的用途,个人认为一个比较有用的是我们可以在文件的头部做一些资源的初始化。

创建 initialize-mongo-instance.mjs

下面定义了一个初始化 MongoDB 实例的方法 initializeMongoInstance()

// initialize-mongo-instance.mjsimport mongodb from 'mongodb';const dbConnectionUrl = 'mongodb+srv://:@cluster0-on1ek.mongodb.net/test?retryWrites=true&w=majority';const { MongoClient } = mongodb;export default function initializeMongoInstance (dbName, dbCollectionName) {  return MongoClient.connect(dbConnectionUrl, { useUnifiedTopology: true })    .then(dbInstance => {      const dbObject = dbInstance.db(dbName);      const dbCollection = dbObject.collection(dbCollectionName);      console.log("[MongoDB connection] SUCCESS");      return dbCollection;    }).catch(err => {      console.log(`[MongoDB connection] ERROR: ${err}`);      throw err;    });}

index.mjs

例如,index.mjs 为我的启动文件,在启动时需要初始化上面定义的 initializeMongoInstance 方法,如果是之前只能写在一个 async 声明的异步函数中,现在有了 Top-level await 支持,可以直接像如下方式来写:

import initializeMongoInstance from './initialize-mongo-instance.mjs';const testCollection = await initializeMongoInstance('dbName', 'test');

Reference

  • nodejs.org/en/blog/release/v14.3.0/
  • github.com/tc39/proposal-top-level-await

推荐JavaScript经典实例学习资料文章

《深入细品浏览器原理「流程图」》

《JavaScript 已进入第三个时代,未来将何去何从?》

《前端上传前预览文件 image、text、json、video、audio「实践」》

《深入细品 EventLoop 和浏览器渲染、帧动画、空闲回调的关系》

《推荐13个有用的JavaScript数组技巧「值得收藏」》

《前端必备基础知识:window.location 详解》

《不要再依赖CommonJS了》

《犀牛书作者:最该忘记的JavaScript特性》

《36个工作中常用的JavaScript函数片段「值得收藏」》

《Node + H5 实现大文件分片上传、断点续传》

《一文了解文件上传全过程(1.8w字深度解析)「前端进阶必备」》

《【实践总结】关于小程序挣脱枷锁实现批量上传》

《手把手教你前端的各种文件上传攻略和大文件断点续传》

《字节跳动面试官:请你实现一个大文件上传和断点续传》

《谈谈前端关于文件上传下载那些事【实践】》

《手把手教你如何编写一个前端图片压缩、方向纠正、预览、上传插件》

《最全的 JavaScript 模块化方案和工具》

《「前端进阶」JS中的内存管理》

《JavaScript正则深入以及10个非常有意思的正则实战》

《前端面试者经常忽视的一道JavaScript 面试题》

《一行JS代码实现一个简单的模板字符串替换「实践」》

《JS代码是如何被压缩的「前端高级进阶」》

《前端开发规范:命名规范、html规范、css规范、js规范》

《【规范篇】前端团队代码规范最佳实践》

《100个原生JavaScript代码片段知识点详细汇总【实践】》

《关于前端174道 JavaScript知识点汇总(一)》

《关于前端174道 JavaScript知识点汇总(二)》

《关于前端174道 JavaScript知识点汇总(三)》

《几个非常有意思的javascript知识点总结【实践】》

《都2020年了,你还不会JavaScript 装饰器?》

《JavaScript实现图片合成下载》

《70个JavaScript知识点详细总结(上)【实践】》

《70个JavaScript知识点详细总结(下)【实践】》

《开源了一个 JavaScript 版敏感词过滤库》

《送你 43 道 JavaScript 面试题》

《3个很棒的小众JavaScript库,你值得拥有》

《手把手教你深入巩固JavaScript知识体系【思维导图】》

《推荐7个很棒的JavaScript产品步骤引导库》

《Echa哥教你彻底弄懂 JavaScript 执行机制》

《一个合格的中级前端工程师需要掌握的 28 个 JavaScript 技巧》

《深入解析高频项目中运用到的知识点汇总【JS篇】》

《JavaScript 工具函数大全【新】》

《从JavaScript中看设计模式(总结)》

《身份证号码的正则表达式及验证详解(JavaScript,Regex)》

《浏览器中实现JavaScript计时器的4种创新方式》

《Three.js 动效方案》

《手把手教你常用的59个JS类方法》

《127个常用的JS代码片段,每段代码花30秒就能看懂-【上】》

《深入浅出讲解 js 深拷贝 vs 浅拷贝》

《手把手教你JS开发H5游戏【消灭星星】》

《深入浅出讲解JS中this/apply/call/bind巧妙用法【实践】》

《手把手教你全方位解读JS中this真正含义【实践】》

《书到用时方恨少,一大波JS开发工具函数来了》

《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)》

《手把手教你JS 异步编程六种方案【实践】》

《让你减少加班的15条高效JS技巧知识点汇总【实践】》

《手把手教你JS开发H5游戏【黄金矿工】》

《手把手教你JS实现监控浏览器上下左右滚动》

《JS 经典实例知识点整理汇总【实践】》

《2.6万字JS干货分享,带你领略前端魅力【基础篇】》

《2.6万字JS干货分享,带你领略前端魅力【实践篇】》

《简单几步让你的 JS 写得更漂亮》

《恭喜你获得治疗JS this的详细药方》

《谈谈前端关于文件上传下载那些事【实践】》

《面试中教你绕过关于 JavaScript 作用域的 5 个坑》

《Jquery插件(常用的插件库)》

《【JS】如何防止重复发送ajax请求》

《JavaScript+Canvas实现自定义画板》

《Continuation 在 JS 中的应用「前端篇」》

作者:五月君 Nodejs技术栈

转发链接:https://mp.weixin.qq.com/s/tNjbpD3paVKxHmo5bq5QIw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux输入ls后不显示_零基础学习之Linux基础命令小结

安装完重启后,没有像sery所说在图形界面崩溃了,由于我没有安装X-WINDOWS而是直接进入了文本界面。如果你想做linux管理的话,最好在文本界面下工作,这样会适应如下图:第一行显示的是我们所安装的linux是Red Hat 企业4第二行显示的是…

.gitignore文件_【第1739期】为Git仓库里的.idea文件夹正名

前言.idea该不该提交到代码仓库中呢?你的意见呢?今日早读文章由《Flask Web开发》作者李辉分享。正文从这开始~~在网络上,我曾多次看到人们对于Git仓库中的.idea文件夹的偏见。最近的一次是在某个博客中技术专家对于志…

监控linux时间不对,shell 计算故障时间 配合web监控

#!/bin/bash#checkfail.log 为SHELL监控网站时间存放的日志文件 https://blog.51cto.com/junhai/2437965fail_time(){starttimetail -n 1000 checkfail.log |grep "$url"|grep "第1次"|tail -n 3|head -n 1|awk {print $1, $2} #取网站挂掉的时间endtimet…

linux redis清空数据恢复,Redis数据恢复--误删数据后一次吓尿的经历

1、起因,一个flushdb命令因为误操作,输入了一个flushdb命令,导到redis里0号库里的数据全部清空,OMG,这里有不少重要信息,如果被领导知道,必开除2、appendonly留有生机仔细想想,当时数…

c语言 枚举类型 uint32_浅谈C语言枚举类型 | 附自创用法分享

经济学家说过,路边是不会有100元的;但如果有,你还是要捡起来。同理,在貌似万物免费的网络时代,你是很难找到有针对性的好资料;但是如果有,希望你能认真学习吸收。比如笔者今天写的这一篇一今天这…

java pdf增删改查_如何利用Java代码操作索引库?

今天是刘小爱自学Java的第161天。感谢你的观看,谢谢你。学习计划安排如下:学了几天的Elasticserch,但都是它本身的知识点,如何通过Java语言去操作它呢?这就好比以前学数据库,在数据库工具中通过sql语句也能…

sublime text3 怎么配置、运行python_SublimeText3按ctrl+b执行python无反应

最后更新时间:2017-09-14 现象: 在Sublime中打开.py文件,按”ctrlb”执行时无反应。点击工具->编译系统中已经有且识别到Python,但执行”run(ctrlshiftb)”时无反应,Sublime左下角提示”No B…

internetreadfile读取数据长度为0_YOLOV3的TensorFlow2.0实现,支持在自己的数据集上训练...

GitHub链接:calmisential/YOLOv3_TensorFlow2​github.com我主要参考了yolov3的一个keras实现版本:qqwweee/keras-yolo3​github.com目前支持在PASCAL VOC 2012数据集上训练和自定义数据集上训练,具体的训练过程可参考项目仓库中的README文档…

深井软岩巷道群支护技术与应用_深井软岩巷道深浅孔帷幕注浆技术

一、成果内容1.基本原理对失修巷道进行刷扩、支护,满足使用断面后进行帮顶喷浆、底板整平,先底板注浆,然后帮、顶注浆。锚架充支护巷道直接底板整平后,先底板后帮、顶注浆。通过全断面深浅孔联合注水泥浆进行巷道加固,…

店铺咨询系统c语言,课内资源

1 题目介绍1.1 问题描述出于不同目的的旅客对交通工具和交通路径有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个交通咨询系统程序,为旅客提供最优决策的交通咨询。1.2 需求分析提供对…

f分布表完整图_【教育统计答疑】如何理解正态分布、均值分布、^2分布、t分布和F分布...

许多教育统计的初学者都表示这几个分布感到学起来非常吃力,结合最近上课的体会以及答疑的情况,觉得很有必要在这里简单地对这部分内容进行澄清和梳理,以助理解。首先,“为什么要学习这几个分布”可能是许多人纠结的问题&#xff0…

新颖的c语言题目,新颖版c语言经典习题100例(全面面)

新颖版c语言经典习题100例(全面面) (66页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.90 积分实用文档C语言习题100例(最新整理版)习题目录:(按住Ctrl点击可以快速跳转到…

c语言jt808协议库,平台如何应答——关于JT/T808协议

前两篇也说明了一些应答的相关内容,对于刚接触的开发者来说恐怕还是不太容易理解,这里专门列举一个篇幅来讲解如何针对终端设备上报的信息进行应答。严格来讲,如果不应答,终端设备会判别为服务平台断开连接,就会重复发…

熊猫的python小课账号_学习python中的pandas有没有好的教程推荐?

之前好多人私信我python数据分析怎么快速入门,我在这里直接介绍一下自己的心得经验吧。 要学习pandas,我并不建议看大量的教程,等看完教程,天都黑了,一觉醒来热情都凉了。 我的建议是,首先放平心态&#xf…

ubuntu nfs linux,Ubuntu的NFS功能配置

环境:Ubuntu 10.04步骤:1.sudo apt-get install portmap2.sudo apt-get install nfs-kernel-server注意:第2步我安装失败,换源后仍然如此,最后我在新立得里面搜索到nfs-kernel-server,安装成功3.在更目录下新建共享目录:mkdir /forlinux4.gedit /etc/exprots,在后面添加/forlin…

一个android工程生成两个aar,android studio生成aar包并在其他工程引用aar包(示例代码)...

1.aar包是android studio下打包android工程中src、res、lib后生成的aar文件,aar包导入其他android studio 工程后,其他工程可以方便引用源码和资源文件2.生成aar包步骤:①.用android studio打开一个工程,然后新建一个Module&#…

android 尺寸变化动画,Android ScaleAnimation类:尺寸变化动画类

ScaleAnimation类是Android系统中的尺寸变化动画类,用于控制View对象的尺寸变化,该类继承于Animation类。 ScaleAnimation类中的很多方法都与Animation类一致,该类中最常用的方法便是ScaleAnimation构造方法。【基本语法】public ScaleAnimat…

javascript 本地对象和内置对象_详解 JavaScript 面向对象

1. 概述JavaScript面向对象比较难理解的点是类的继承。不管是es5写法还是es6写法,JavaScript继承的本质是原型链。具体可看我的上一篇文章:田浩:详解原型、原型链、构造函、实例、new​zhuanlan.zhihu.com因为es6有专门的语法,写法…

工作汇报ppt案例_【赠书】开工大吉!今年一定要干过写PPT的!

不知不觉,春节就过去了,新年开工,朋友圈里晒满了开工红包,领了开工礼就意味着真正新的一年开始了。虽然假期的慵懒安逸留下了倦怠的后遗症,但状态依旧切换到工作模式,毕竟每年都希望能比过去更进一步&#…

postscript打印机什么意思_涨知识|你不知道的关于打印机的打印过程和打印机驱动的那些事...

以前一直以为打印很简单,不就是编辑好文件按个“打印”就行了?但其实打印过程可以复杂到你分分钟“怀疑人生”。你以为的打印过程可能是这样的 ↓。我们看到的打印过程然而,真正的打印过程是这样的 ↓。实际上的打印过程打印机打印一页文件或…