在使用诸如restify/expressjs等Nodejs Web Framework时,我们最头疼的问题就是回调黑洞。

虽然后又Koa/Koa2号称“The Next Framework”使用co解决问题,但是核心this的设计和各种小流middleware对req/res的随意滥用,导致我对这个框架失去好感。

Expressjs依然是我在使用Nodejs编写API和Web时的首选框架。

在使用Expressjs时,如果我们也想使用await/async这些在ES7 stage-3中的特性,就需要借助别的工具。目前我推荐的是typescript(时下版本2.0.10)和babel,本章只介绍使用babel的方法,如有同学与我一样同样对ts兴趣甚深,可私信或留言彼此学习进步。

第一步

我们仍然使用npm init来生成一个package,内容如下:

 1 {
 2   "name": "express_babel_demo2",
 3   "version": "1.0.0",
 4   "description": "",
 5   "main": "index.js",
 6   "scripts": {
 7     "test": "echo \"Error: no test specified\" && exit 1"
 8   },
 9   "author": "",
10   "license": "ISC",
11   "dependencies": {
12     "babel-core": "^6.18.2",
13     "babel-preset-es2015": "^6.18.0",
14     "babel-preset-stage-3": "^6.17.0",
15     "babel-runtime": "^6.18.0",
16     "bluebird": "^3.4.6",
17     "express": "^4.14.0"
18   },
19   "devDependencies": {
20     "babel-plugin-transform-runtime": "^6.15.0"
21   }
22 }

可以看到,在我们的依赖中,已经存在babel-core等组件,bluebird是我最喜欢的一个Promise A+实现,性能也是真男人。

第二步

然后我们新建一个.babelrc,用来描述babel的配置:

 1 {
 2     "presets": [
 3         "stage-3",
 4         "es2015"
 5     ],
 6     "plugins": [
 7         [
 8             "transform-runtime",
 9             {
10                 "polyfill": false,
11                 "regenerator": true
12             }
13         ]
14     ]
15 }

我们使用babel官方推荐的transform-runtime来进行启动翻译工作,而不是pollify,虽然后者有更多的功能,但是对于不需要的人来说,那是对原生对象的污染和项目性能的负担。

第三步

新建一个index.js文件,这个是demo的启动文件,代码依旧简单,引入babel、babel翻译和expressjs的入口:

1 require('babel-core/register');
2 require('./app.js');
3 require("babel-core").transform("code", {
4     plugins: ["transform-runtime"]
5 });

第四步

编写一个app.js,使用原生fs库异步读取一下package.json文件并输出:

 1 var express = require('express');
 2 var app = express();
 3 var fs = require('fs');
 4 var Promise = require('bluebird');
 5
 6 app.get('/', function (req, res) {
 7     testAsync();
 8     res.send('Hello World!');
 9 });
10
11 var server = app.listen(3000, function () {
12     var host = server.address().address;
13     var port = server.address().port;
14
15     console.log('Example app listening at http://%s:%s', host, port);
16 });
17
18
19
20 async function testAsync(name) {
21     console.log("hello");
22     for (let i = 0; i < 3; i++) {
23         let fileContent = await readFile("package.json");
24         console.log(new Buffer(fileContent).toString());
25         console.log(".");
26     }
27     console.log(name);
28 }
29 let readFile = Promise.promisify(fs.readFile);

然后执行一下npm install,会下载依赖

再node index.js启动我们所编写的express demo。

浏览器访问localhost:3000,在控台里就能看到“异步读取、同步输出”的内容了。

demo github地址:GitHub Demo


转载于:https://www.cnblogs.com/xidu/p/6110560.html

使用async/await——Nodejs+ExpressJs+Babel相关推荐

  1. async/await工作机制探究--NodeJS

    ES6中的async/await让Promise变得更加简便,通常await处理的链式Promise会包裹在函数中,返回结果仍然是一个Promise对象. 但是当await直接处理链式Promise时 ...

  2. [转] 以 async/await 为例,说明 babel 插件怎么搭

    你一定碰到过这些库 babel-polyfill 项目地址:https://github.com/babel/babel/blob/master/packages/babel-polyfill 通过两 ...

  3. Promise async/await的理解和用法

    Promise && async/await的理解和用法 为什么需要promise(承诺)这个东西 在之前我们处理异步函数都是用回调这个方法,回调嵌套的时候会发现 阅读性 和 调试 的 ...

  4. 使用 Async / Await 来编写简明的异步代码

    原文链接:https://blog.patricktriest.com/what-is-async-await-why-should-you-care/ 复制代码 停止书写回调函数并爱上ES8 以前, ...

  5. Node.js Async Await in ES7

    原文 http://stackabuse.com/node-js-async-await-in-es7/ One of the most exciting features coming to Jav ...

  6. 理解 async/await 的执行

    这是一篇简单的短文章,方便理解. 开局先丢官宣:sec-async-function-definitions 这个链接是对 await 的解释,解释了它的执行. await 的执行意味着(官宣巴拉巴拉 ...

  7. async function_Electron IPC 通信如何使用 async/await 调用?

    前言碎语 此想法是在使用 electron 进程间通信(IPC)过程中,无法忍受其 API 的使用不友好性而产生. 为了提高代码可读性.可维护性,而不得已造轮子了. 生命在于折腾,其乐无穷. Elec ...

  8. async js 返回值_JS异步编程 | Async / Await / Generator 实现原理解析

    async/await实现 在多个回调依赖的场景中,尽管Promise通过链式调用取代了回调嵌套,但过多的链式调用可读性仍然不佳,流程控制也不方便,ES7 提出的async 函数,终于让 JS 对于异 ...

  9. async function_理解 Iterator, Generator 和 Async/Await

    戳蓝字「前端技术优选」关注我们哦! 这里重点理解他们三者分别是什么,有什么区别,以及分别适用什么场景 Iterator Iterator是最简单最好理解的,在很久之前我写过一篇文章 循环的秘密 里面讨 ...

最新文章

  1. Zend_Db_Table详解
  2. 中软国际入职java考核_中软国际技术人员入职试题2(Java)
  3. oracle创建数据库步骤
  4. P1494-[国家集训队]小Z的袜子【分块优化莫队】
  5. MOOS学习笔记1——HelloWorld
  6. hdu-4417-Super Mario
  7. SpringCloud学习笔记025---SpringBoot_注释理解_@Qualifier 注释
  8. IT男几时而立(下)
  9. java websocket注解_【websocket】spring boot 集成 websocket 的四种方式
  10. 黑客恶意修改化学成分参数,远程投毒饮用水
  11. 传统IDC部署网站(八)
  12. xp 无法关闭计算机,电脑xp系统关不了机怎么解决
  13. Python编写求100以内素数
  14. 联想y7000 Linux显卡驱动,联想Y7000安装显卡驱动
  15. 基于mini2440嵌入式linux上整合一套Domoticz智能家居系统(九)使用domoticz+mosquitto+Android客户端实现控制mini2440上的LED(二)
  16. [Practical.Vim(2012.9)].Drew.Neil.Tip10学习摘要
  17. 在人工智能的角逐中,仿真数据是重要的平衡力量吗?
  18. RadarApp结构体定义
  19. What's New in Dundas Chart 6.1
  20. 软件毕业设计如何降重

热门文章

  1. 【常见问题】Can not perform this action after onSaveInstanceState
  2. Swfit 常用特性(Attribute)关键字
  3. NSString类详解
  4. Flutter开发之BottomSheetDialog选择组件-5(44)
  5. Flutter开发之ListView下拉刷新上拉加载更多(35)
  6. Flutter开发之名篇及demo收录
  7. (0050)iOS开发之钥匙串存储
  8. postman断言测试脚本一
  9. 中学计算机基础Word授课ppt,中学信息技术- 计算机硬件与软件基础知识课件.ppt...
  10. Windows版 mysql 5.7.16安装