異步和回調(diào)
JavaScript中有一些居家旅行必備的異步函數(shù), 例如 setInterval, setTimeout, forEach 以及最常見的事件綁定.
異步函數(shù)用于指派 (assign) 一些延遲執(zhí)行的任務(wù), 這些任務(wù)也就是回調(diào)函數(shù)
回調(diào)函數(shù)只有在特定的條件滿足后, 才會(huì)被調(diào)用.
也就是說異步函數(shù)僅僅是在內(nèi)存中創(chuàng)建了回調(diào)函數(shù)的執(zhí)行環(huán)境就結(jié)束, 解釋器并不會(huì)等待回調(diào)函數(shù)的執(zhí)行, 而是立即執(zhí)行后面的語句. 而回調(diào)函數(shù)的執(zhí)行, 則是由條件觸發(fā)的.
nodejs 初始化一個(gè)服務(wù)器
在nodejs中, 我們通過 http.creatServer(requestListener) 創(chuàng)建一個(gè)server實(shí)例, requestListener是請(qǐng)求的處理函數(shù).
requestListener 接收兩個(gè)默認(rèn)的位置參數(shù), 第一個(gè)為http請(qǐng)求, 第二個(gè)為http響應(yīng).
let http = require('http')
let fs = require('fs')
let url = require('url')
// 指定端口
port = 8888
let server = http.createServer( (request, response) => {
})
server.listen(port)
在 nodejs 中, 為了獲得請(qǐng)求體, 我們需要監(jiān)聽請(qǐng)求的 'data' 事件, 將每次獲得的數(shù)據(jù)拼接起來. 然后在請(qǐng)求接收完畢后, 也就是請(qǐng)求的 'end' 事件的回調(diào)函數(shù)中來定義對(duì)數(shù)據(jù)的處理和服務(wù)器的響應(yīng).
以下代碼用于實(shí)現(xiàn)這個(gè)需求:
let requestBodyString = ''
request.on('data', (chunk) => {
requestBodyString += chunk
})
request.on('end', () => {
let requestBody = JSON.parse(requestBodyString)
response.statusCode = 200
response.end(JSON.stringify(requestBody))
})
關(guān)閉請(qǐng)求和響應(yīng)
關(guān)閉請(qǐng)求和響應(yīng)的必要性:
根據(jù)TCP協(xié)議, 每一次發(fā)起請(qǐng)求或響應(yīng)后都需要結(jié)束, 才能取消對(duì)接socket的阻塞狀態(tài), 對(duì)接的socket才能獲取到數(shù)據(jù).
為了動(dòng)態(tài)地響應(yīng)請(qǐng)求, 我們需要在請(qǐng)求結(jié)束的事件回調(diào)函數(shù)中解析數(shù)據(jù), 這些任務(wù)就是異步的.
異步的陷阱:
在上面示例代碼的基礎(chǔ)上, 如果我們?cè)谡?qǐng)求的end事件處理函數(shù)下面加上 response.end() 語句, 那么等到回調(diào)函數(shù)中的代碼執(zhí)行的時(shí)候, 針對(duì)請(qǐng)求的響應(yīng)早已經(jīng)被提前結(jié)束了, 回調(diào)函數(shù)中的代碼仍然會(huì)執(zhí)行, 代碼也不會(huì)報(bào)錯(cuò), 但是其中的響應(yīng)將永遠(yuǎn)不會(huì)抵達(dá).
let requestBodyString = ''
request.on('data', (chunk) => {
requestBodyString += chunk
})
request.on('end', () => {
let requestBody = JSON.parse(requestBodyString)
response.statusCode = 200
response.end(JSON.stringify(requestBody))
})
// 在request對(duì)象的end事件綁定完成后立即執(zhí)行, 不會(huì)等待end事件的回調(diào)函數(shù).
response.end()
最后編輯于 :2018.08.15 23:18:55
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者