高阶函数:与传统函数只能传递或返回规定的数据类型相比,高阶函数可以返回函数,如下:
function foo(x){
return function(){
return x;
}
}
由于高阶函数可以传递函数为参数,因此可以传递不同类型的函数来实现不同的功能,更加灵活
使用偏函数,如果要创建一组函数,比如isFunction,isString等功能类似的函数,如果每个都独自定义会很麻烦,可以使用统一的方式定义,通过参数的传递让这个函数像工厂一样生产类似的函数,代码如下:
var isType = function(type){
return function(obj){
returntoString.call(obj) == ‘[object’ + type + ‘]’;
}
}
var isString = isType(‘String’);
这样就可以取代如下复杂麻烦的分别定义方法:
var isString = function(type){
return function(obj){
returntoString.call(obj) == ‘[object String]’;
}
}
……
异步编程的难点:
1、 异常处理方面,不能使用try-catch方法
异步I/O的实现主要包括两个阶段:提交请求和处理结果
异步方法的定义:
var async = function(callback){
process.nextTick(callback);//nextTick()表示下一个事件循环
}
try/catch方法只能捕获当此事件循环内的异常,不能捕获callback执行时抛出的异常
编写异步方法的原则:必须执行调用者传入的回调函数;正确传递回异常供调用者判断。示例代码:
var async = function(callback){
process.nextTick(function(){
var result = something;
if(error){
return callback(error);
}
Callback(null,result);
})
}
2、 函数嵌套过深
3、 阻塞代码(js中没有类似sleep()的线程沉睡功能)
4、 多线程编程
事件发布/订阅模式:
//订阅
emitter.on(“event1”,function(message){
console.log(message);
});
//发布
Emitter.emit(’event1’, “I am a message!”);
这里利用on和emit方法,对对象的事件进行侦听和发布
关于EventListener
EventEmitter是nodejs核心的一部分。很多nodejs对象继承自EventEmitter,用来处理事件,及回调。来看API中的例子
Javascript代码
var util = require("util");
var events = require("events");//EventEmitter通过events模块来访问
function MyStream() {//新建一个类
events.EventEmitter.call(this);
}
util.inherits(MyStream, events.EventEmitter);//使这个类继承EventEmitter
MyStream.prototype.write = function(data) {//定义一个新方法
this.emit("data", data);//在此触发名为"data"事件
}
var stream = new MyStream();
stream.on("data", function(data) {//注册监听器,监听名为"data"事件
console.log('Received data: "' + data + '"');
})
stream.write("It works!"); // Received data: "It works!"
通过继承EventEmitter可为对象注册和触发相关事件。
实现一个继承EventEmitter的类的实例:
var events = require(‘events’);
function Stream(){
event.EventEmitter.call(this);
}
util.inherits(Stream,events.EventEmitter);
//util模块中封装了集成的方法