2016-11-25 158 views
0

我有你的標準回調地獄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完成。但我可能錯過了一些東西。這個代碼是否可以通過撥打電話isItisItReally,分配事件處理程序,跳出所有回調,回調完成createServer,然後,然後所有額外的東西(數據/結束等等)從事件隊列中運行?

+0

我們需要看到真實的實際工作代碼,而不是您在此處使用的僞代碼。中止異步操作不是一個通用主題,而是針對確切的操作。有些可以放棄,有些不能。沒有通用的答案。這隻能在你的真實代碼的確切上下文中回答。如果您有一系列的操作,您可能需要使用承諾,以便您可以拒絕承諾,並將通知更高級別,然後才能採取相應措施。 – jfriend00

回答

0

通常,您將使用return語句。當你調用return下面的任何代碼將不會被執行。雖然,如果您的功能isIt()isItReally()是異步功能,那麼您將遇到麻煩,因爲它們以同步方式使用。