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

2018-02-24 15:25 更新

這個問題可不好回答(至少對我來說),不過這是Node.js原生的工作方式。它是事件驅(qū)動的,這也是它為什么這么快的原因。

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

這一切都?xì)w結(jié)于“Node.js是事件驅(qū)動的”這一事實(shí)。好吧,其實(shí)我也不是特別確切的了解這句話的意思。不過我會試著解釋,為什么它對我們用Node.js寫網(wǎng)絡(luò)應(yīng)用(Web based application)是有意義的。

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

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

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

那么在我們的Node.js程序中,當(dāng)一個新的請求到達(dá)8888端口的時候,我們怎么控制流程呢?

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

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

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

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

至少對我來說,需要一些功夫才能弄懂它。你如果還是不太確定的話就再去讀讀Felix的博客文章。

讓我們再來琢磨琢磨這個新概念。我們怎么證明,在創(chuàng)建完服務(wù)器之后,即使沒有HTTP請求進(jìn)來、我們的回調(diào)函數(shù)也沒有被調(diào)用的情況下,我們的代碼還繼續(xù)有效呢?我們試試這個:

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ù)器開始工作之后,也輸出一段文本。

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

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

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號