nodejs记录1——async函数

其实手动配置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文件:

{
    "presets": [
        "es2015",
        "stage-3"
    ],
    "plugins": []
}

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

var sleep = function(time) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve(`the program stopped ${time}ms`);
        }, time);
    });
}
var start = async function() {
    console.log("start");
    var sleeptime = await sleep(3000);
    console.log(sleeptime);
    console.log("end");
}


start();

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

start
the program stopped 3000ms
end

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

var sleep = function(time) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve(`the program stopped ${time}ms`);
        }, time);
    });
}

var start = async function() {
    console.log("start");
    var sleeptime = await sleep(3000);
    console.log(sleeptime);
    console.log("end");
}

// start(3000);

var sleep2 = function(time) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            reject("error accured!");
        }, time);
    });
}

var start2 = async function() {
    try {
        console.log("start");
        var sleeptime = await sleep2(3000);
        console.log(sleeptime);
        console.log("end");
    } catch (e) {
        console.log(e);
    }
}

// start2(3000);


/*async函数的上下文 */
var asyncForFunc = async function(time) {
    for (var i = 0; i < 10; i++) {
        console.log(`当前开始的是是第${i+1}次循环`);
        var time2 = await sleep(time);
        console.log(`当前是第${i+1}次输出:${time2}`);
    }
}

asyncForFunc(1000);

程序正确输出:

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

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

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

var fibonacci = function(n) {
    if (typeof n != "number") {
        throw new Error("n should be a number");
    }
    if (n < 0) {
        throw new Error("n should >= 0");
    }
    if (n <= 1) {
        return n;
    }
    if (n > 10) {
        throw new Error("n should <= 10");
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
}

if (require.main == module) {
    //如果是直接执行main,则进入此处
    //如果是被其他js引入,则此处不会执行
    var n = Number(process.argv[2]);
    console.log(`fibonacci(${n}) is ${fibonacci(n)}`);
}

exports.fibonacci = fibonacci;

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

var main = require("../main");
var should = require("should");

describe("test/main.test.js", function() {
    it("should equal 55 when n === 10", function() {
        // done(); //done可以传一个err参数,err不为空时直接中断后续操作,空时不中断
        main.fibonacci(10).should.equal(55);
    });
    it("should equal 0 when n === 0", function() {
        main.fibonacci(0).should.equal(0);
    });
    it("should equal 1 when n === 1", function() {
        main.fibonacci(1).should.equal(1);
    });
    it("should throw when n > 10", function() {
        (function() {
            main.fibonacci(11);
        }).should.throw("n should <= 10");
    });
    it("should throw when n < 0", function() {
        (function() {
            main.fibonacci(-1);
        }).should.throw("n should >= 0");
    });
    it("should throw when n isnt number", function() {
        (function() {
            main.fibonacci('hehe');
        }).should.throw("n should be a number");
    });
});

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

测试不通过:

测试通过:

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博文

PHP5中Cookie与 Session详解

1、Cookie和Session简介与区别 在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功...

2597
来自专栏有趣的Python

13 -Flask构建弹幕微电影网站-后台逻辑(五)

已上线演示地址: http://movie.mtianyan.cn 项目源码地址:https://github.com/mtianyan/movie_proj...

32411
来自专栏JarvanMo的IT专栏

Node.js文件路径的坑

没错,我想读取system-config.json中的配置。刚开始,无论如何也读不到,连个错误信息也没有。调试了一番,终于出了一个错误信息: no such ...

1224
来自专栏landv

Java开发环境笔记

1643
来自专栏编程

怎么解决koa写server发布的噩梦

前言 ? . 以前在用koa写server的时候,发布简直是噩梦。需要将src里面的全部文件都覆盖掉,config配置文件也要覆盖,稍有不慎就会线上报各种各样的...

2298
来自专栏QQ音乐技术团队的专栏

Webpack 实用技巧高效实战

在项目中使用了一段时间的 Webpack ,得益于其多元的功能支持和配置定制,得到了很多本地编译和依赖管理的帮助。在搭建好配置和架构之后,开发过程中可以不再关注...

3819
来自专栏Linux驱动

第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)

本章学习如何启动第一个应用程序 1.在前面的分析中我们了解到,在init进程中内核挂接到根文件系统之后,会开始启动第一个应用程序: kernel_init函数代...

1998
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第40章 RL-TCPnet之TFTP客户端(精简版)

本章节为大家讲解RL-TCPnet的TFTP客户端应用,学习本章节前,务必要优先学习第38章的TFTP基础知识。有了这些基础知识之后,再搞本章节会有事半功倍的效...

361
来自专栏专注数据中心高性能网络技术研发

LD_LIBRARY_PATH和LIBRARY_PATH的区别

先来看看程序编译和链接的过程: 编译过程又可以分成两个阶段:编译和汇编。 编译 编译是指编译器读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换...

2594
来自专栏Android群英传

SQLite在NDK中的重生

811

扫码关注云+社区