Node填坑教程——常用库
作为函数式编程来说,流程控制和函数库是必不可少的(应该吧)。
下面我们介绍两个常用的库。
lodash:完整的api请参阅,https://lodash.com/docs。这里我们只演示几个简单的例子。
安装
E:\project\heron-lesson\demo4>npm install lodash --save
var data1 = [1, 2, 3, 4, 5];
var data2 = [
{'user': 'barney', 'age': 36, 'active': true},
{'user': 'fred', 'age': 40, 'active': false},
{'user': 'pebbles', 'age': 1, 'active': true}
]; var _ = require('lodash'); // find 只会返回一条数据,没有条件默认返回第一条
var r1 = _.find(data1);
console.log(r1); // -> 1 var r2 = _.find(data1, function (item) {
return item > 2;
});
console.log(r2); // -> 3 var r3 = _.find(data2, function (item) {
return item.age > 20;
});
console.log(r3); // -> { user: 'barney', age: 36, active: true } // filter 返回所有满足条件的数据, 没有条件返回所有
var r4 = _.filter(data1);
console.log(r4); // -> [ 1, 2, 3, 4, 5 ] var r5 = _.filter(data1, function (item) {
return item > 2;
});
console.log(r5); // -> [ 3, 4, 5 ] var r6 = _.filter(data2, function (item) {
return item.age > 20;
});
console.log(r6); // -> [ { user: 'barney', age: 36, active: true }, { user: 'fred', age: 40, active: false } ]
我们演示了两个函数的用法,虚拟两个数组的数据,find函数会返回数组的一个元素,filter函数会返回多条。这里需要注意的是,即使filter一条数据也没有返回,也会返回空数组 []。
关于流程控制
我们来看这个例子,我们先模拟两个异步函数。
var firstFn = function (callback) {
setTimeout(function () {
return callback('This is first task.');
}, 200);
};
var secondFn = function (callback) {
setTimeout(function () {
return callback('This is second task.');
}, 10);
};
接着看这样的写法。
firstFn(function (message) {
console.log(message);
});
secondFn(function (message) {
console.log(message);
});
结果是
This is second task.
This is first task.
并没有按照代码顺序得到结果。这是因为异步任务延迟的不同造成的。可以将顺序的函数套到前面的回调里,来达到预期的结果。像这样
firstFn(function (message) {
console.log(message);
secondFn(function (message) {
console.log(message);
});
});
然而,这样做的话,过多的嵌套,会让你的代码全是嵌套的括号,难以阅读和修改。
那么我们按照这个库来改进代码
E:\project\heron-lesson\demo4>npm install q --save
这是Promise标准的一个实现,我们可以编写Promise风格的代码了。
这种写法的每一步都返回Promise,所以我们之前的 fn(err, data) 风格的函数也得改成Promise风格的。
var firstFn = function () {
var defer = q.defer();
setTimeout(function () {
console.log('This is first task.')
defer.resolve();
}, 200);
return defer.promise;
};
var secondFn = function () {
var defer = q.defer();
setTimeout(function () {
console.log('This is second task.')
defer.resolve();
}, 10);
return defer.promise;
};
var q = require('q');
firstFn()
.then(function () {
return secondFn();
})
.done(function () {
console.log('done')
});
得到结果
This is first task.
This is second task.
done
async风格的例子,请跳转至另外一篇 函数式编程第一步——流程控制
项目下载:demo4
Node填坑教程——常用库的更多相关文章
- Node填坑教程——前言
Node是什么? Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物 ...
- Node填坑教程——简易http服务器
我们这一期做一个简易的http服务器. 先建一个文件夹,就算是一个空的项目了.然后新建app.js和package.json文件. 这样一个简易项目的基本文件就建好了. 通过命令行工具,在项目路径下输 ...
- Node填坑教程——HelloWorld
环境安装(极简): Node需要的环境可以说及其简单,也可以说及其复杂.为什么这么说呢? 如果里只需要运行环境那么到Node官网下载一个包就行了.里面自带npm管理工具,这是包管理工具,以后会频繁的使 ...
- Node填坑教程——整理文件
如果你能把所有代码写进一个文件,并且能很好的管理.协调.多人开发.那么可以跳过这期(请务必带我飞). 我们接着完善上期的代码,给代码分家. node并没有启动入口,更没有固定的项目结构,文件配置.这些 ...
- Node填坑教程——过滤器
所谓“过滤器”,只是一个概念,可以理解是一个路由,也可以理解为一个中间件.原理非常简单,就是利用匹配规则,让其有限匹配在正常的路由前面处理就行了. 比如有如下路由 app.get('/', funct ...
- ReactNative 从环境和第一个demo说起,填坑教程
一.React-Native MacOS必备环境配置: 1.安装homebrew(这东西可以理解为命令行的app商店) /usr/bin/ruby -e "$(curl -fsSL http ...
- backbone新手填坑教程资源
backbone 入门第二版 http://www.kancloud.cn/kancloud/backbonejs-learning-note/49379 backbone 入门讲解 http://w ...
- Vue3+Typescript+Node.js实现微信端公众号H5支付(JSAPI v3)教程--各种填坑
----微信支付文档,不得不说,挺乱!(吐槽截止) 功能背景 微信公众号中,点击菜单或者扫码,打开公众号中的H5页面,进行支付. 一.技术栈 前端:Vue:3.0.0,typescript:3.9.3 ...
- Node学习笔记(四):gulp+express+io.socket部署angularJs2(填坑篇)
这篇就先暂停下上篇博客--你画我猜的进度,因为在做这个游戏的时候,想采用最新的ng2技术,奈何坑是一片又一片,这边就先介绍下环境部署和填坑史 既然要用ng2,首先要拿到资源,我这边用的是angular ...
随机推荐
- 【Android先进】我们为什么要创建Activity基类Activity什么是一般的基类方法
今天,它可以被视为只是基本完成了其首个商业项目,在发展过程中,风格,然而随着工作经验的积累.最终開始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. 首先,在如今的项目 ...
- Angular绑定数据时转义html标签
AngularJs在绑定数据时默认会以文本的形式出现在页面上,比如我现在有这样一段代码 <div ng-controller="testCtrl">{{data}}&l ...
- Skynumber
Time Limit: 1000ms Memory Limit: 128000KB 64-bit integer IO format: Java class name: Submit Sta ...
- 第15章 迭代器模式(Iterator Pattern)
原文 第15章 迭代器模式(Iterator Pattern) 迭代器模式(Iterator Pattern) 概述: 在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构 ...
- fpga该驱动器调试dev_dbg 无输出
近期需要调试fpga驾驶,整个是非常蛋疼.dev_dbg 我想用这个作为没有成功调试输出,它已被彻底打垮! 反射... 现在基于以下设置是不相关的打印,和网上说的有些出入,问题还得研究下. 驱动程序调 ...
- xdebug的安装和配置方法
首先让php错误显示,仅仅须要改动php.ini其中的2条指令,把 displayerrors和htmlerrors都设置为On,例如以下所看到的 html_errors = On di ...
- MVC使用Bootstrap
ASP.NET MVC使用Bootstrap系列(5)——创建ASP.NET MVC Bootstrap Helpers 摘要: 序言ASP.NET MVC允许开发者创建自定义的HTML Helper ...
- ArcEngine载入中SDE问题栅格数据
当直接加载矢量数据到IFeatureWorkspace接口可,但是,在装载门格当要传送的数据IRasterWorkspaceEx接口. 效果如下面的,对可以被添加到双击Globe在. watermar ...
- Host和Server的开发
Host和Server的开发 对于开发人员来说,代码就是最好的文档,如上一篇博文所说,下面我们就会基于Kanata项目的一些具体调用代码,来进一步深入理解OWIN的实现和作用. 今天我们先针对Host ...
- SQL语句分享[不定期更新]
查询临时表 if object_id('')>0 查询表中的数据 select 'insert into ta1(col1,col2,col3) values('''+ltrim(列1)+''' ...