nodejs 异步和回调函数/事件

nodejs

nodejs是单线程单进程应用程序,但是V8引擎提供的异步执行回调接口可以处理大量的并发,nodejs性能非常高。nodejs积分每一个api都支持回调函数。

回调函数

要点:异步函数将回调函数作为最后一个参数,回调函数接受错误对象为第一个参数。异步编程依托回调来实现,nodejs异步编程直接体现酒是回调。

阻塞代码实列  

添加一个app.js  data.txt

var fs = require('fs');

var data = fs.readFileSync('data.txt');

console.log(data.toString());

console.log('程序执行完成');

 

执行

非阻塞代码

/**
 * 
 * 回调作为异步最后一个
 * 错误对象作为回调第一个参数
 * 
 * */
fs.readFile('data.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());

})
console.log('程序执行完成');

 运行:

事件 

驱动原理:nodejs使用事件驱动模型,当webservice接收到请求,就关闭它然后惊喜处理,然后去服务下一个web请求,当这个请求完成,它被放回处理列队,当列队达到列开头,这个结果被返给用户。

绑定和监听事件

/**
 * 
 * 1.引入events模块
 * 2.创建事件监听和事件处理程序
 * 3.触发事件
 * 
 */


var events = require('events');

var eventEmitter = new events.EventEmitter();
var myevtHandler = function () {
    console.log('我是处理程序!');
}
eventEmitter.on('myevt', myevtHandler);
eventEmitter.emit('myevt');

运行

监听器传参

/**
 * 
 * 1.引入events模块
 * 2.创建事件监听和事件处理程序
 * 3.触发事件
 * 
 */


var events = require('events');

var eventEmitter = new events.EventEmitter();
var myevtHandler = function () {
    console.log('我是处理程序!');
}
eventEmitter.on('myevt', myevtHandler);


var listerHandler0 = function () {
    console.log(0);

}

var listerHandler = function (a, b) {
    console.log(a, b);

}

var listerHandler2 = function (a) {
    console.log(a);

}

var listerHandler3 = function (a, b, c) {
    console.log(a);

}

/**
 * 
 * 一个事件多个监听器时
 * 会先后调用监听器回调函数
 * 
 */
eventEmitter.on('lister', listerHandler0);
eventEmitter.on('lister', listerHandler);
eventEmitter.on('lister', listerHandler2);
eventEmitter.on('lister', listerHandler3);


eventEmitter.emit('myevt');
/**
 * 按参数顺序执行监听器  有事件监听返回true  否则false
 */
console.log(eventEmitter.emit('lister', 1, 2));
console.log(eventEmitter.emit('lister2', 1, 2));

运行: 

 

其他属性

1 addListener(event, listener)
为指定事件添加一个监听器到监听器数组的尾部。
2 on(event, listener)
为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
server.on('connection', function (stream) {
  console.log('someone connected!');
});
3 once(event, listener)
为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});
4 removeListener(event, listener)

移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。

它接受两个参数,第一个是事件名称,第二个是回调函数名称。

var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
5 removeAllListeners([event])
移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。
6 setMaxListeners(n)
默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。
7 listeners(event)
返回指定事件的监听器数组。
8 emit(event, [arg1], [arg2], [...])
按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。

猜你喜欢

转载自blog.csdn.net/zYjmor/article/details/82893288