我有你的标准回调地狱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