1775720
今在我有个学生去面试,面试官问:如何避免回调地狱? 学生回答:使用EventEmitter对象可以避免 面试官:错,不能。要使用Promise。
我的学生回来问我:兴哥EventEmitter真的能解决回调地狱吗? 我不知道怎么回答,因为我一直用EventEmitter来编写异步回调的。node4.X版本中的文件操作不都是支持EventEmitter吗?
exports.copyStream = function() {
var et = new events.EventEmitter();
et.on("cpstart",function() {
fs.open("home.js","r",function( err,fd ) {
if( err ) {
return console.log(err);
}
console.log("打开home.js文件成功");
et.emit("cpread",fd);
});
}).on("cpread",function( fd ) {
var buf = new Buffer(1024);
fs.read(fd,buf,0,buf.length,0,function( err, bytes ){
if( err ) {
return console.log(err);
}
console.log("一共读取了" + bytes + "个字节");
et.emit("cpwrite","home_stream_1.js",buf,parseInt(bytes));
et.emit("cpclose",fd,"home.js文件");
});
}).on("cpclose",function( fd,msg ){
fs.close(fd,function( err ) {
if( err ) {
return console.log(err);
}
console.log(msg + "关闭成功");
});
}).on("cpwrite",function(filename, buf, bytes ) {
fs.open(filename,"w",function( err,fd ) {
if( err ) {
return console.log(err);
}
console.log("打开" + filename + "成功");
fs.write(fd,buf,0,bytes,function( err,written ) {
if( err ) {
return console.log(err);
}
console.log("一共写入了" + written + "个字节");
et.emit("cpclose",fd,filename + "文件");
});
});
}).emit("cpstart");
}
这样算不算解决了回调地狱的问题,大家教教我。