我有一个工作类,它有很多不同的实用程序方法,当执行中出现问题时,它会发出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
也发出一条"错误"消息,但这只是将can踢到下一层,并且不会停止工作脚本的执行(即,如果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的精细异步nodejs库,因为它感觉你正在重新发明流控制,而"async.flopper"可以很好地处理流控制。
如果你觉得它不适合你——按照你采用的模式,你可以选择在完成每一步时发布事件(请参阅下面示例中的"完成"事件)。这将允许您侦听这些事件,以表明没有发生错误,并且进入下一步是有意义的。让"finalize"取一个可选错误,让您的员工区分正常完成和异常完成。这还没有经过测试,但类似的东西可能是这样的:
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.
}