我有你的標準回調地獄http
服務器像(簡體):如何中止處理的NodeJS HTTP服務器的請求
http.createServer((req, res) => {
doSomething(() => {
doMoreSomethings(() => {
if (!isIt())
// explode A
if (!isItReally())
// explode B
req.on('data', (c) => {
if (bad(c))
// explode C
});
req.on('end',() => {
// explode D
});
});
});
};
我知道的結束請求的唯一途徑是res.end()
,這是異步,所以你打電話後的東西會運行(據我所知)。有沒有一種方法可以在飛行中執行假冒process.exit
並中止處理請求,所以我不會浪費時間在其他方面?例如,我如何停止在上述// explode
行,而不是處理其他任何東西? throw
不跨越範圍邊界。基本上,我想,我想return
或從嵌套回調中跳出createServer
回調。唯一能做到這一點的方法是能夠使用單個路徑創建代碼,並且每個步驟只有一條語句嗎?就像水平編碼一樣,而不是垂直KLOC。
顯然,我是Node noob。
編輯:也許另一種方式來問的問題是:是否有可能在// explode C
行中止,無法讀取任何數據,不處理end
事件,不處理在doMoreSomethings
回調再行(如果有的話)?我猜後者是不可能的,因爲據我所知,doMoreSomethings
運行完成,包括附加數據和結束事件處理程序,然後才能處理隊列中的下一個事件(可能是一個數據事件)得到處理,在這一點doMoreSomethings
完成。但我可能錯過了一些東西。這個代碼是否可以通過撥打電話isIt
和isItReally
,分配事件處理程序,跳出所有回調,回調完成createServer
,然後,然後所有額外的東西(數據/結束等等)從事件隊列中運行?
我們需要看到真實的實際工作代碼,而不是您在此處使用的僞代碼。中止異步操作不是一個通用主題,而是針對確切的操作。有些可以放棄,有些不能。沒有通用的答案。這隻能在你的真實代碼的確切上下文中回答。如果您有一系列的操作,您可能需要使用承諾,以便您可以拒絕承諾,並將通知更高級別,然後才能採取相應措施。 – jfriend00