Node.js - 回调和事件驱动解决异步

导读:

  • 假定读者已了解同步与异步的区别,当你使用Node.js异步操作时,难免会出现拿到的值为undefined,这个时候常用的解决方法就是回调函数 / 事件驱动来使其达到同步的目的。

例子:

  • 原始一般操作:
const fs = require('fs')

function getMime() {
    fs.readFile('mime.json',function(err,data) {
        // console.log(data.toString());
        return data.toString();
    })
}

console.log(getMime());  // undefined     原因:当执行到readFile()时,由于是异步读取文件,故该函数执行完成,首先返回了undefined
  • 回调函数:
const fs = require('fs')

function getMime(callback) {
    fs.readFile('mime.json',function(err,data) {
        // console.log(data.toString());
        // return data;
        callback(data)
    })
}

getMime((result) => {
    console.log(result.toString());  // 获取到值
})
  • 事件驱动:
const events = require('events')
const fs = require('fs')

let EventEmitter = new events.EventEmitter()

// 广播和 接收广播
// 监听 to_parent的广播

/*EventEmitter.on('to_parent', (data) => {
    // 监听到广播后才执行回调
    console.log(`接收到了这个广播事件的数据:${data}`)   // 2.接收到了这个广播事件的数据:send
})

setTimeout(() => {
    console.log('开始广播...')    // 1.开始广播
    // 广播to_parent事件
    EventEmitter.emit('to_parent', 'send')
},100)*/


function getMime(callback) {
    fs.readFile('mime.json',function(err,data) {
        EventEmitter.emit('data', data)     // 异步处理到这里就广播data事件
    })
}

getMime()

EventEmitter.on('data', (data) => {
    console.log(data.toString())
})   // 接收广播拿到传来的数据

总结:

  • 很经典的问题,经常会遇到,注意掌握。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容