Node填坑教程——常用库

作为函数式编程来说,流程控制和函数库是必不可少的(应该吧)。

下面我们介绍两个常用的库。

lodash:完整的api请参阅,https://lodash.com/docs。这里我们只演示几个简单的例子。

安装

E:\project\heron-lesson\demo4>npm install lodash --save
 1 var data1 = [1, 2, 3, 4, 5];
 2 var data2 = [
 3     {‘user‘: ‘barney‘, ‘age‘: 36, ‘active‘: true},
 4     {‘user‘: ‘fred‘, ‘age‘: 40, ‘active‘: false},
 5     {‘user‘: ‘pebbles‘, ‘age‘: 1, ‘active‘: true}
 6 ];
 7
 8 var _ = require(‘lodash‘);
 9
10 // find 只会返回一条数据,没有条件默认返回第一条
11 var r1 = _.find(data1);
12 console.log(r1);  // -> 1
13
14 var r2 = _.find(data1, function (item) {
15    return item > 2;
16 });
17 console.log(r2); // -> 3
18
19 var r3 = _.find(data2, function (item) {
20    return item.age > 20;
21 });
22 console.log(r3); // -> { user: ‘barney‘, age: 36, active: true }
23
24
25 // filter 返回所有满足条件的数据, 没有条件返回所有
26 var r4 = _.filter(data1);
27 console.log(r4); // -> [ 1, 2, 3, 4, 5 ]
28
29 var r5 = _.filter(data1, function (item) {
30    return item > 2;
31 });
32 console.log(r5); // -> [ 3, 4, 5 ]
33
34 var r6 = _.filter(data2, function (item) {
35     return item.age > 20;
36 });
37 console.log(r6); // -> [ { user: ‘barney‘, age: 36, active: true }, { user: ‘fred‘, age: 40, active: false } ]

我们演示了两个函数的用法,虚拟两个数组的数据,find函数会返回数组的一个元素,filter函数会返回多条。这里需要注意的是,即使filter一条数据也没有返回,也会返回空数组 []。



关于流程控制

我们来看这个例子,我们先模拟两个异步函数。

 1 var firstFn = function (callback) {
 2     setTimeout(function () {
 3         return callback(‘This is first task.‘);
 4     }, 200);
 5 };
 6 var secondFn = function (callback) {
 7     setTimeout(function () {
 8         return callback(‘This is second task.‘);
 9     }, 10);
10 };

接着看这样的写法。

1 firstFn(function (message) {
2     console.log(message);
3 });
4 secondFn(function (message) {
5     console.log(message);
6 });

结果是

This is second task.
This is first task.

并没有按照代码顺序得到结果。这是因为异步任务延迟的不同造成的。可以将顺序的函数套到前面的回调里,来达到预期的结果。像这样

1 firstFn(function (message) {
2     console.log(message);
3     secondFn(function (message) {
4         console.log(message);
5     });
6 });

然而,这样做的话,过多的嵌套,会让你的代码全是嵌套的括号,难以阅读和修改。

那么我们按照这个库来改进代码

E:\project\heron-lesson\demo4>npm install q --save

这是Promise标准的一个实现,我们可以编写Promise风格的代码了。

这种写法的每一步都返回Promise,所以我们之前的 fn(err, data) 风格的函数也得改成Promise风格的。

 1 var firstFn = function () {
 2     var defer = q.defer();
 3     setTimeout(function () {
 4         console.log(‘This is first task.‘)
 5         defer.resolve();
 6     }, 200);
 7     return defer.promise;
 8 };
 9 var secondFn = function () {
10     var defer = q.defer();
11     setTimeout(function () {
12         console.log(‘This is second task.‘)
13         defer.resolve();
14     }, 10);
15     return defer.promise;
16 };
17
18
19 var q = require(‘q‘);
20
21 firstFn()
22     .then(function () {
23         return secondFn();
24     })
25     .done(function () {
26         console.log(‘done‘)
27     });

得到结果

This is first task.
This is second task.
done


async风格的例子,请跳转至另外一篇 函数式编程第一步——流程控制

时间: 2024-10-29 19:09:43

Node填坑教程——常用库的相关文章

Node填坑教程——前言

Node是什么? Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码. 以上是比较官方的解释.简单来说,就相当于一个开发平台,不过这个平台及其简陋,官方没有ide(其实也不太需要),它不像php需要容器来运行,所有的开发.调试.管理.发布等工具都是民间的自己动手的产物,所以也诠释了为什么它的目标是帮助程序员构建高度可伸缩的应用程序. 进来发现Node有

Node填坑教程——HelloWorld

环境安装(极简): Node需要的环境可以说及其简单,也可以说及其复杂.为什么这么说呢? 如果里只需要运行环境那么到Node官网下载一个包就行了.里面自带npm管理工具,这是包管理工具,以后会频繁的使用它的功能.这时候Node的基本环境已经齐备了,尽管没有ide,没有测试,没有代码管理,没有其他的编译环境(C.C++.Python等).安装步骤不管是windows还是mac都是下一步的事,这里就不多说了. 那么,我们先从这样一个状态下进入Hello World. 打开终端,windows下开始-

Node填坑教程——整理文件

如果你能把所有代码写进一个文件,并且能很好的管理.协调.多人开发.那么可以跳过这期(请务必带我飞). 我们接着完善上期的代码,给代码分家. node并没有启动入口,更没有固定的项目结构,文件配置.这些全部要靠自己动手,靠约定,正所谓约定由于配置.因为作者书读的少,只会MVC结构,姑且按照MVC结构来分. 建立如下目录. /bin/ : 项目的启动文件,也可以放其他乱七八糟的脚本.如果你有多种环境或者多个入口,这样分就很有必要的 /configure/ : 配置文件,上图中根据生产环境和开发环境配

Node填坑教程——过滤器

所谓“过滤器”,只是一个概念,可以理解是一个路由,也可以理解为一个中间件.原理非常简单,就是利用匹配规则,让其有限匹配在正常的路由前面处理就行了. 比如有如下路由 1 app.get('/', function (req, res, next) { 2 res.send('index'); 3 }); 访问根目录就能看到index.在前面加上一个路由,封锁全部请求 1 app.use(function (req, res, next) { 2 return res.send('filter');

在CENTOS7下安装kubernetes填坑教程(原创)

kubernetes(以下简称"k8s")目前是公认的最先进的容器集群管理工具,在1.0版本发布后,k8s的发展速度更加迅猛,并且得到了容器生态圈厂商的全力支持,这包括coreos.rancher等,诸多提供公有云服务的厂商在提供容器服务时也都基于k8s做二次开发来提供基础设施层的支撑,比如华为.可以说k8s也是Docker进军容器集群管理和服务编排领域最为强劲的竞争对手. 现在的Red Hat centos7的用户,已经可以使用熟悉的yum来直接安装k8s,但是真要安装起来,还是有相

Node学习笔记(四):gulp+express+io.socket部署angularJs2(填坑篇)

这篇就先暂停下上篇博客--你画我猜的进度,因为在做这个游戏的时候,想采用最新的ng2技术,奈何坑是一片又一片,这边就先介绍下环境部署和填坑史 既然要用ng2,首先要拿到资源,我这边用的是angularJs2 beta版的,网上的资源有两种,一个是文件全压缩版的.min.js版的另一个就是一大堆乱七八糟的js文件,主要是ng2已经完全采用TypeScript,加之对es6的支持,所以需要引入一大堆兼容,编译文件 这边刚好特别手欠想学学gulp,于是开搞配置gulp环境,压缩所有的js文件成一个mi

css 填坑常用代码分享

以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. /*强制不换行*/ white-space:nowrap; /*自动换行*/ word-wrap: break-word; word-break: normal; /*强制英文单词断行*/ word-break:break-all; 2. 两端对齐 text-align:justify;text-justify:inter-ideogra 3. 去掉Webkit(chrome)浏览器中input(文本框)或texta

初涉node.js做微信测试公众号一路填坑顺便发现个有趣的其他漏洞

[微信测试公众号] 半年前耍着玩搭起来的“微信简历”,是LAMP版的,很皮毛. 微信的官方文档在这 http://mp.weixin.qq.com/wiki/index.php 1.获取access token 2.自定义菜单创建,直接在调试工具上做了 http://mp.weixin.qq.com/debug 3.接入指南(接入自己的网站) 4.接收微信消息,判断消息类型,判断消息关键字(比如来自哪个按钮),响应消息 这里有个小坑,不同类型的消息数据结构略有不同,判空最好做细致点. [V2.0

css 填坑常用代码分享[居家实用型]

原文地址 http://www.cnblogs.com/jikey/p/4233003.html 以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. 一. css 2.x code 1. 文字换行 /*强制不换行*/ white-space:nowrap; /*自动换行*/ word-wrap: break-word; word-break: normal; /*强制英文单词断行*/ word-break:break-all; 2. 两端对齐 text-align:j