其实手动配置babel环境并不难,记录下步骤:

1、首先npm init创建一个nodejs项目

2、全局安装babel-cli处理工具:npm i babel-cli -g

3、cd到项目下安装babel依赖:npm i babel-preset-es2015 babel-preset-stage-3 --save-dev,这俩包主要是处理es6转码需要使用的

4、配置.babelrc文件:

  1. {
  2. "presets": [
  3. "es2015",
  4. "stage-3"
  5. ],
  6. "plugins": []
  7. }

5、编写我们的测试代码:

  1. var sleep = function(time) {
  2. return new Promise(function(resolve, reject) {
  3. setTimeout(function() {
  4. resolve(`the program stopped ${time}ms`);
  5. }, time);
  6. });
  7. }
  8. var start = async function() {
  9. console.log("start");
  10. var sleeptime = await sleep(3000);
  11. console.log(sleeptime);
  12. console.log("end");
  13. }
  14.  
  15. start();

6、cmd窗口执行:babel-node index.js,说明下:babel-node命令会可以理解为开启了一个新的node环境,该环境下es6代码被支持,当然,你也可以使用其它babel命令,比如:babel index.js -o index.compile.js,然后再执行node index.compile.js即可实现相同效果,关于babel详细介绍可以参考官网使用说明及参数说明。如下是输出打印:

  1. start
  2. the program stopped 3000ms
  3. end

再来看一个例子,是在async函数中使用for循环调用async函数,直接贴代码了:

  1. var sleep = function(time) {
  2. return new Promise(function(resolve, reject) {
  3. setTimeout(function() {
  4. resolve(`the program stopped ${time}ms`);
  5. }, time);
  6. });
  7. }
  8.  
  9. var start = async function() {
  10. console.log("start");
  11. var sleeptime = await sleep(3000);
  12. console.log(sleeptime);
  13. console.log("end");
  14. }
  15.  
  16. // start(3000);
  17.  
  18. var sleep2 = function(time) {
  19. return new Promise(function(resolve, reject) {
  20. setTimeout(function() {
  21. reject("error accured!");
  22. }, time);
  23. });
  24. }
  25.  
  26. var start2 = async function() {
  27. try {
  28. console.log("start");
  29. var sleeptime = await sleep2(3000);
  30. console.log(sleeptime);
  31. console.log("end");
  32. } catch (e) {
  33. console.log(e);
  34. }
  35. }
  36.  
  37. // start2(3000);
  38.  
  39. /*async函数的上下文 */
  40. var asyncForFunc = async function(time) {
  41. for (var i = 0; i < 10; i++) {
  42. console.log(`当前开始的是是第${i+1}次循环`);
  43. var time2 = await sleep(time);
  44. console.log(`当前是第${i+1}次输出:${time2}`);
  45. }
  46. }
  47.  
  48. asyncForFunc(1000);

程序正确输出:

循环输出如果改成forEach的话就会直接报错,因为forEach函数改变了await的上下文:await必须出现在async函数中,而forEach非async函数。

额外记录一些东西,那就是nodejs中测试用例的编写:

主要使用的npm包:mocha(测试工具)、should(断言工具)、istanbul(case覆盖率测试工具),如下是待测试的代码:

  1. var fibonacci = function(n) {
  2. if (typeof n != "number") {
  3. throw new Error("n should be a number");
  4. }
  5. if (n < 0) {
  6. throw new Error("n should >= 0");
  7. }
  8. if (n <= 1) {
  9. return n;
  10. }
  11. if (n > 10) {
  12. throw new Error("n should <= 10");
  13. }
  14. return fibonacci(n - 1) + fibonacci(n - 2);
  15. }
  16.  
  17. if (require.main == module) {
  18. //如果是直接执行main,则进入此处
  19. //如果是被其他js引入,则此处不会执行
  20. var n = Number(process.argv[2]);
  21. console.log(`fibonacci(${n}) is ${fibonacci(n)}`);
  22. }
  23.  
  24. exports.fibonacci = fibonacci;

接下来我们编写测试用例,新建文件夹test,并main.test.js文件:

  1. var main = require("../main");
  2. var should = require("should");
  3.  
  4. describe("test/main.test.js", function() {
  5. it("should equal 55 when n === 10", function() {
  6. // done(); //done可以传一个err参数,err不为空时直接中断后续操作,空时不中断
  7. main.fibonacci(10).should.equal(55);
  8. });
  9. it("should equal 0 when n === 0", function() {
  10. main.fibonacci(0).should.equal(0);
  11. });
  12. it("should equal 1 when n === 1", function() {
  13. main.fibonacci(1).should.equal(1);
  14. });
  15. it("should throw when n > 10", function() {
  16. (function() {
  17. main.fibonacci(11);
  18. }).should.throw("n should <= 10");
  19. });
  20. it("should throw when n < 0", function() {
  21. (function() {
  22. main.fibonacci(-1);
  23. }).should.throw("n should >= 0");
  24. });
  25. it("should throw when n isnt number", function() {
  26. (function() {
  27. main.fibonacci('hehe');
  28. }).should.throw("n should be a number");
  29. });
  30. });

然后再在根目录输入命令mocha进行测试,可能会有如下输出,分别表示测试不通过与通过示例:

测试不通过:

测试通过:

使用istanbul主要是进行代码覆盖率测试,详细介绍可以参考阮老师的文章

在当前项目根目录下执行命令:istanbul cover _mocha 即可,看下输出如下:

这里罗列出了语句覆盖率测试、分支覆盖率测试、函数覆盖率以及行覆盖率测试的结果,over。。。

nodejs记录1——async函数的更多相关文章

  1. 初识async函数

    为什么会出现async函数 首先从大的方面来说,出现async函数时为了解决JS编程中的异步操作,再往具体说就是为了对以往异步编程方法的一种改进,也有人说仅仅只是Generator 函数的语法糖,这个 ...

  2. nodejs进阶(7)—async异步流程控制

    Async介绍 Async是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 m ...

  3. C# 5.0 Async函数的提示和技巧

    一.创建Async函数 Async是C# 5.0中新增的关键字,通过语法糖的形式简化异步编程,它有如下三种方式: async Task<T> MyReturningMethod { ret ...

  4. async 函数-----------------解决异步操作隧道的亮光

    之前也学过,只是没有学好,公司现在用的都是async函数 , 所以决定把它弄懂.最近看了看阮一峰的博客,做下记录. 异步I/O不就是读取一个文件吗,干嘛要搞得这么复杂?异步编程的最高境界,就是根本不用 ...

  5. 深入浅出ES6教程『async函数』

    大家好,本人名叫苏日俪格,大家叫我 (格格) 就好,在上一章节中我们学到了Symbol & generator的用法,下面我们一起来继续学习async函数: async [ə'zɪŋk]:这个 ...

  6. async 函数学习笔记

    async函数就是Generator函数的语法糖. var fs = require('fs'); var readFile = function (fileName) { return new Pr ...

  7. async 函数

    同步 console.log(1); console.log(2); console.log(3); console.log(4); //异步 ajax 文件读取io操作 console.log(1) ...

  8. ECMAScript 6 学习(二)async函数

     1.什么是async函数 2.用法 2.1基本用法 3.语法 3.1返回promise对象 3.2promise状态的变化 3.3await命令 1.什么是async函数 async函数也是异步编程 ...

  9. ES2017中的async函数

    前面的话 ES2017标准引入了 async 函数,使得异步操作变得更加方便.本文将详细介绍async函数 概述 async 函数是 Generator 函数的语法糖 使用Generator 函数,依 ...

随机推荐

  1. JAVA Double去掉科学计数"E"

    当Double的值很大时,显示的结果会变成带E的科学计数法显示,在报表的数据显示的时候不方便阅读,需要去掉E,将原数据显示 public static void main(String[] args) ...

  2. 删除标注关联仿dda命令DIMDISASSOCIATE

    static void sk_ARXTestXDatamydimassoc(void) { // Add your code for command sk_ARXTestXData.mydimasso ...

  3. [Virtualization] VMware虚拟机三种网络模式详解(转)

    原文:http://www.linuxidc.com/Linux/2016-09/135521.htm

  4. javascript简要笔记

      零. 数据   0. 变量 分为字符串,数字,undefined, null,对象 undefined类型是只声明了变量,但是没赋值 可以使用typeof()函数来查看变量类型   例子1 var ...

  5. 8102 年的现代 Web 开发最佳实践(笑)

    简评:8102 年了,现在 web 开发的最佳实践是什么,让本文来告诉你.原文只提到一部分,可以查看 reddit 上对此文的评论查看补充的最佳实践 https://old.reddit.com/r/ ...

  6. Laravel 的核心概念

    工欲善其事,必先利其器.在开发Xblog的过程中,稍微领悟了一点Laravel的思想.确实如此,这篇文章读完你可能并不能从无到有写出一个博客,但知道Laravel的核心概念之后,当你再次写起Larav ...

  7. 编译原理(一)绪论概念&文法与语言

    绪论概念&文法与语言 以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 绪论基本概念 1. 低级语言:字位码.机器语言.汇编语言.与特定的机器有关,功效高,但使用复杂.繁琐.费时 ...

  8. Optional类

    参照: 一篇简单使用介绍 官网详细用法介绍 包含各种例子的cheetsheet 一个封装某个value的容器 一般可用于方法返回值类型,提醒调用方,这个值可能为null,所以需要处理(因为空指针异常是 ...

  9. rdlc报表函数

    字符串函数 使用串联运算符和      Visual Basic 常量可将多个字段组合在一起.以下表达式返回两个字段,它们分别位于同一文本框的不同行中: 复制代码 =Fields!FirstName. ...

  10. 直接线性变换解法(DLT)用于标定相机

    直接线性变换法是建立像点坐标和相应物点物方空间坐标之间直接的线性关系的算法.特点:不需要内外方位元素:适合于非量测相机:满足中.低精度的测量任务:可以标定单个相机. 1 各坐标系之间的关系推导直接线性 ...