Node.js - 回調(diào)和事件驅(qū)動(dòng)解決異步

導(dǎo)讀:

  • 假定讀者已了解同步與異步的區(qū)別,當(dāng)你使用Node.js異步操作時(shí),難免會(huì)出現(xiàn)拿到的值為undefined,這個(gè)時(shí)候常用的解決方法就是回調(diào)函數(shù) / 事件驅(qū)動(dòng)來(lái)使其達(dá)到同步的目的。

例子:

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

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

console.log(getMime());  // undefined     原因:當(dāng)執(zhí)行到readFile()時(shí),由于是異步讀取文件,故該函數(shù)執(zhí)行完成,首先返回了undefined
  • 回調(diào)函數(shù):
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());  // 獲取到值
})
  • 事件驅(qū)動(dòng):
const events = require('events')
const fs = require('fs')

let EventEmitter = new events.EventEmitter()

// 廣播和 接收廣播
// 監(jiān)聽(tīng) to_parent的廣播

/*EventEmitter.on('to_parent', (data) => {
    // 監(jiān)聽(tīng)到廣播后才執(zhí)行回調(diào)
    console.log(`接收到了這個(gè)廣播事件的數(shù)據(jù):${data}`)   // 2.接收到了這個(gè)廣播事件的數(shù)據(jù):send
})

setTimeout(() => {
    console.log('開(kāi)始廣播...')    // 1.開(kāi)始廣播
    // 廣播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())
})   // 接收廣播拿到傳來(lái)的數(shù)據(jù)

總結(jié):

  • 很經(jīng)典的問(wèn)題,經(jīng)常會(huì)遇到,注意掌握。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容