基于事件驅(qū)動(dòng)的回調(diào)

2018-02-24 15:25 更新

這個(gè)問(wèn)題可不好回答(至少對(duì)我來(lái)說(shuō)),不過(guò)這是Node.js原生的工作方式。它是事件驅(qū)動(dòng)的,這也是它為什么這么快的原因。

你也許會(huì)想花點(diǎn)時(shí)間讀一下Felix Geisend?rfer的大作 Understanding node.js,它介紹了一些背景知識(shí)。

這一切都?xì)w結(jié)于“Node.js是事件驅(qū)動(dòng)的”這一事實(shí)。好吧,其實(shí)我也不是特別確切的了解這句話(huà)的意思。不過(guò)我會(huì)試著解釋?zhuān)瑸槭裁此鼘?duì)我們用Node.js寫(xiě)網(wǎng)絡(luò)應(yīng)用(Web based application)是有意義的。

當(dāng)我們使用?http.createServer?方法的時(shí)候,我們當(dāng)然不只是想要一個(gè)偵聽(tīng)某個(gè)端口的服務(wù)器,我們還想要它在服務(wù)器收到一個(gè)HTTP請(qǐng)求的時(shí)候做點(diǎn)什么。

問(wèn)題是,這是異步的:請(qǐng)求任何時(shí)候都可能到達(dá),但是我們的服務(wù)器卻跑在一個(gè)單進(jìn)程中。

寫(xiě)PHP應(yīng)用的時(shí)候,我們一點(diǎn)也不為此擔(dān)心:任何時(shí)候當(dāng)有請(qǐng)求進(jìn)入的時(shí)候,網(wǎng)頁(yè)服務(wù)器(通常是Apache)就為這一請(qǐng)求新建一個(gè)進(jìn)程,并且開(kāi)始從頭到尾執(zhí)行相應(yīng)的PHP腳本。

那么在我們的Node.js程序中,當(dāng)一個(gè)新的請(qǐng)求到達(dá)8888端口的時(shí)候,我們?cè)趺纯刂屏鞒棠兀?/p>

嗯,這就是Node.js/JavaScript的事件驅(qū)動(dòng)設(shè)計(jì)能夠真正幫上忙的地方了——雖然我們還得學(xué)一些新概念才能掌握它。讓我們來(lái)看看這些概念是怎么應(yīng)用在我們的服務(wù)器代碼里的。

我們創(chuàng)建了服務(wù)器,并且向創(chuàng)建它的方法傳遞了一個(gè)函數(shù)。無(wú)論何時(shí)我們的服務(wù)器收到一個(gè)請(qǐng)求,這個(gè)函數(shù)就會(huì)被調(diào)用。

我們不知道這件事情什么時(shí)候會(huì)發(fā)生,但是我們現(xiàn)在有了一個(gè)處理請(qǐng)求的地方:它就是我們傳遞過(guò)去的那個(gè)函數(shù)。至于它是被預(yù)先定義的函數(shù)還是匿名函數(shù),就無(wú)關(guān)緊要了。

這個(gè)就是傳說(shuō)中的?回調(diào)?。我們給某個(gè)方法傳遞了一個(gè)函數(shù),這個(gè)方法在有相應(yīng)事件發(fā)生時(shí)調(diào)用這個(gè)函數(shù)來(lái)進(jìn)行?回調(diào)?。

至少對(duì)我來(lái)說(shuō),需要一些功夫才能弄懂它。你如果還是不太確定的話(huà)就再去讀讀Felix的博客文章。

讓我們?cè)賮?lái)琢磨琢磨這個(gè)新概念。我們?cè)趺醋C明,在創(chuàng)建完服務(wù)器之后,即使沒(méi)有HTTP請(qǐng)求進(jìn)來(lái)、我們的回調(diào)函數(shù)也沒(méi)有被調(diào)用的情況下,我們的代碼還繼續(xù)有效呢?我們?cè)囋囘@個(gè):

var http = require("http");

function onRequest(request, response)  {
? console.log("Request received.");
? response.writeHead(200,  {"Content-Type":  "text/plain"});
? response.write("Hello World");
? response.end();
}

http.createServer(onRequest).listen(8888);

console.log("Server has started.");

注意:在?onRequest?(我們的回調(diào)函數(shù))觸發(fā)的地方,我用?console.log?輸出了一段文本。在HTTP服務(wù)器開(kāi)始工作之后,也輸出一段文本。

當(dāng)我們與往常一樣,運(yùn)行它_node server.js_時(shí),它會(huì)馬上在命令行上輸出“Server has started.”。當(dāng)我們向服務(wù)器發(fā)出請(qǐng)求(在瀏覽器訪問(wèn)http://localhost:8888/),“Request received.”這條消息就會(huì)在命令行中出現(xiàn)。

這就是事件驅(qū)動(dòng)的異步服務(wù)器端JavaScript和它的回調(diào)啦!

(請(qǐng)注意,當(dāng)我們?cè)诜?wù)器訪問(wèn)網(wǎng)頁(yè)時(shí),我們的服務(wù)器可能會(huì)輸出兩次“Request received.”。那是因?yàn)榇蟛糠址?wù)器都會(huì)在你訪問(wèn) http://localhost:8888 /時(shí)嘗試讀取 http://localhost:8888/favicon.ico )

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)