2016-11-25 120 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()是异步功能,那么您将遇到麻烦,因为它们以同步方式使用。

相关问题