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 条评论
登录 后参与评论

相关文章

来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统--任务调度系统解析

任务调度系统是什么:他是一个类似Sql Server的代理,他可以帮助你定时处理一些SQL事务

772
来自专栏nummy

PyCharm使用内置SSH

在主菜单中选择Tools|Start SSH Session.., 然后点击弹出框中的Edit credentials:

872
来自专栏拂晓风起

cocos2d-js 3.0 rc0 编译release报错 value for keystore is not valid. it must resolve to a single path

1012
来自专栏自动化测试实战

flask第30篇——宏macro和import标签

然后在templates文件夹中新建index.html文件,并在代码中返回渲染后的文件:

843
来自专栏龙渊阁测试精英

Jmeter(二十九)_dotnet搭建本地接口服务

  这里使用的服务名为Bookshelf,在github上,自行下载。要运行此服务,需要.Net Core SDK 2.1或更高版本。如果尚未安装,从.Net ...

682
来自专栏腾讯云Elasticsearch Service

logstash在Elasticsearch中创建的默认索引模板问题

在ELK架构中,使用logstash收集服务器中的日志并写入到Elasticsearch中,有时候需要对日志中的字段mapping进行特殊的设置,此时可以通过自...

2985
来自专栏python3

python3--模块和包,软件开发规范

在第一次导入某个模块时(比如my_module),会检查该模块是否已经被加载到内存中(执行文件的名称空间对应的内存),如果有则直接引用,如果没有,解释器则会查找...

782
来自专栏从流域到海域

DNS服务

DNS是域名系统(Domain Name Server)的缩写,是一种组织成域层次结构的计算机和网络命名服务系统。DNS用于TCP/IP网络(Internet)...

2928
来自专栏腾讯移动品质中心TMQ的专栏

从Java乱码谈起

在实际项目开发中,特别是涉及到中文输入输出的时候,大家肯定都被各种乱码问题坑过。如果遇到复杂的系统,为了乱码问题折腾几天也不是不可能。

3376
来自专栏积累沉淀

linux umask 详解

在说umask的用法之前我们现在了解一下,umask是什么?umask一般是用在你初始创建一个目录或者文件的时候赋予他们的权限 当我们登录系统之后创建一个文件总...

2146

扫码关注云+社区