gpt4 book ai didi

node.js - 处理NodeJS错误事件?

转载 作者:行者123 更新时间:2023-12-03 08:57:06 32 4
gpt4 key购买 nike

我有一个工作器类,它具有许多不同的实用程序方法,并且在执行中的任何地方出现问题时都发出error消息。由于NodeJS的魔力,error消息很特殊,如果没有人在听它们,它们会变成抛出错误,所以我目前这样做:

var myWorkerFunction = function(input) {
var w = myFactory();
try {
w.dothis();
w.dothat(input);
w.hokeypokey();
return w.finalize();
} catch(e) {
return false;
}
}

我想知道的是,是否有可能完全避免try/catch块? NodeJS的文档似乎表明最好避免不要重新引发捕获的异常(我在这里没有做任何检查,以查看引发异常的真正原因是我的工作人员的逻辑,而不是Node的严重错误)。

所以我想做类似的事情:
var myWorkerFunction = function(input) {
var w = myFactory();
w.on('error', function() {
// How to tell caller of myWorkerFunction() I failed,
// and stop the rest of the myWorkerFunction function? (return false)
});
w.dothis();
w.dothat(input);
w.hokeypokey();
return w.finalize();
}

但是,如何在该事件侦听器函数中触发 myWorkerFunction的“返回”呢?我也可以让 myWorkerFunction发出“错误”消息,但这只会将 jar 踢到下一层,并且不会停止执行工作程序脚本(即,如果 dothis()失败,请不要继续操作并调用 dothat(input))。是否有针对这种情况的编程模式?

编辑:我可以想出的一个解决方案是这样的:
var myWorkerFunction = function(input) {
var w = myFactory();
var hasFailed = false;
w.on('error', function() {
hasFailed = true;
});
w.dothis();
if (hasFailed) return fa;se
w.dothat(input);
if (hasFailed) return false;
w.hokeypokey();
if (hasFailed) return false;
var out = w.finalize();
if (hasFailed) return false;
return out;
}

必须在每行代码之前不断检查我们是否失败了,这不是很优雅。

最佳答案

有一些想法。首先,您可能想看看Caolan McMahon的精美async nodejs library,因为您好像正在重新发明使用“async.waterfall”可以很好处理的流控制。

如果您觉得不合适,那么按照您采用的模式,您可以选择在完成每个步骤后发布事件(请参见下面的示例中的“完成”事件)。这将使您能够侦听那些事件,以指示未发生任何错误,并且继续进行下一步是有意义的。让“最终确定”出现一个可选错误,以使您的工作人员能够区分正常完成与异常完成。这未经测试,但是类似的东西可能看起来像这样:

var myWorkerFunction = function(input) {
var w = myFactory();
w.on('error', function(error) {
// Handle error, log whatever - and finalize with an error?
w.finalize(error);
});
w.on('doneWithThis', function() {
w.dothat(input);
});
w.on('doneWithThat', function() {
w.hokeypokey();
});
w.on('doneWithHokeypokey', function() {
w.finalize();
});

w.dothis(); //starts the ball rolling.
}

关于node.js - 处理NodeJS错误事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21124420/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com