回调函数
存在两个问题
1、不能try catch
执行异步代码,结果放在回调函数里面回调函数再执行,这是两个不同的过程,若是在回调函数中发生错误是捕获不到的
因为try的时候错误还没发生,catch的时候错误已经发生完了,无法捕获
2、不能return
异步代码执行的时候不能立即拿到结果,所以不能return,比如读取文件的过程
3、回调地狱
当访问服务器的时候,比如请求一个html页面,用户列表的话服务器一边会去读取模板文件(可能是ejs, pug,jade,handlebar),另一边还要读取数据(可能是放在文件里,也可能在数据库里),这两个过程都很慢,所以是异步的。
这种方式代码阅读不易
难以维护
效率也很低,因为他们是串行的
fs.readFile('template.txt', 'utf8', function(err, template){
fs.readFile('data.txt', 'utf8', function(err, data){
console.log(template+data);
})
})
通过事件发布订阅解决回调嵌套的问题
// 这时node核心模块中的一个类,通过它可以创建事件发射器的实例
// 里面有on方法表示注册监听,emit方法表示提交事件
let EventEmitter = require('events');
let eve = new EventEmitter();
// 监听数据获取成功事件 事件发生后调用回调函数
eve.on('ready', function(key, value){});
fs.readFile('template.txt', 'utf8', function(err, template){
eve.emit('ready', 'template', template);
});
fs.readFile('data.txt', 'utf8', function(err, data){
eve.emit('ready', 'data', data);
});
通过哨兵函数来处理(不灵活)
function done(key, value){});
fs.readFile('template.txt', 'utf8', function(err, template){
done('template', template);
});
fs.readFile('data.txt', 'utf8', function(err, data){
done('data', data);
});