var fs = require('fs')
function fn(){
fs.readFile('nodejs.js', (err, data) => {
console.log(data.toString())
//这里返回的data值是属于回调函数,不属于外面的fn函数,因此从外面拿不到这里的data值
return data
})
//因为阻塞的原因无法将data值返回出去
return data
}
console.log(fn())
上段代码中,无法获取到data值。一个是因为data属于回调函数,不属于外面的函数,所以外面拿不到这里的data值。另一个data值因为非阻塞的原因,也无法将data值返回出去。
解决方法一:用回掉函数解决非阻塞问题
function fn(callback){
fs.readFile('nodejs.js', (err, data) => {
console.log(data.toString())
//利用回调函数,将data值以参数的形式传出去
callback(data)
})
}
fn(function(result){
console.log(result)
})
解决方法二:用事件驱动解决非阻塞的问题
var events = require('events')
var EventEmitter = new events.EventEmitter()
function fn(){
fs.readFile('nodejs.js', (err, data) => {
console.log(data.toString()
//利用事件驱动,发送自定义事件,将data值以参数的形式传出去
EventEmitter.emit('dataInfo', data)
})
}
fn()
//在函数执行后,监听自定义事件,并获取到data值
EventEmitter.on('dataInfo', function(data){
console.log(data)
})
nodejs中的事件驱动
//引入事件模块
var events = require('events')
//实例化EventEmitter方法
var EventEmitter = new events.EventEmitter()
//监听自定义事件;data为接收到的数据
EventEmitter.on('to-info', function(data){})
//发送自定义事件;emit的第二个参数为携带的内容
EventEmitter.emit('to-info', '需要发送的数据')