Node填坑教程——常用库
2024-10-11 22:47:00
作为函数式编程来说,流程控制和函数库是必不可少的(应该吧)。
下面我们介绍两个常用的库。
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
最新文章
- jquery/zepto 圣诞节雪花飞扬
- Orchard源码分析(7.1):Routing(路由)相关
- 状态压缩DP
- java时间库Joda-Time
- 用eclipse创建maven项目
- HW6.3
- A*寻路算法的探寻与改良(三)
- The Angles of a Triangle
- hdu2952Counting Sheep
- php随笔6-thinkphp OA系统 JS 实时显示当前时间
- delphi第2节
- 驰骋工作流引擎 -Webservice接口说明文档
- 【Python 06】汇率兑换1.0-1(IPO与字符串转数字)
- maven 项目pom文件引入lib下的jar包
- 使用idea的springboot项目出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
- Oracle EBS FORM 设置块属性
- 搭建MySQL高可用负载均衡集群(转)
- django2.1---中间件
- ALTER 语句总结
- [翻译] M13BadgeView
热门文章
- 五通信算法:五种编码增益比较matlab模拟
- java RC4加密和解码
- 2014 Multi-University Training Contest 1/HDU4861_Couple doubi(数论/法)
- jQuery形式可以计算,它包含了无线电的变化价格,select价格变化,删除行动态计算加盟
- 讨论oracle在rowid和rownum
- angularjs从零开始(一)
- asp.net学习之SqlDataSource
- ExtJs在disabled和readOnly美学分析
- MyEclipse2014 设备 checkstyle、PMD、findbugs 最简单的方法 详细说明
- android--解--它们的定义tabhost(动态添加的选项+用自己的主动性横向滑动标签+手势切换标签页和内容特征)