深入浅出nodejs学习笔记——异步编程

高阶函数:与传统函数只能传递或返回规定的数据类型相比,高阶函数可以返回函数,如下:

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模块中封装了集成的方法

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值