Tyl*_*ang 3 javascript node.js
最近,我读过TJ的博客文章:"Farewell Node.js".
我不太了解Node失败的部分.这里是:
在我看来,Go中的错误处理是优越的.节点很棒,因为你必须考虑每个错误,并决定做什么.然而节点失败是因为:
- 你可能会得到重复的回调
- 你可能根本没有得到回调(迷失方向)
- 你可能会得到带外错误
- 发射器可能会发生多个"错误"事件
- 缺少"错误"事件将一切都发送到地狱
- 经常不确定什么需要"错误"处理程序
- "错误"处理程序非常冗长
- 回调很糟糕
当作者写道"你可能根本没有得到回调(陷入困境)"时,会提到什么具体问题?
这意味着该错误是在地狱丢失,因为工作的功能并没有"得到一个回调",即,错误被"吞噬",因为没有回调来处理它.
var foo = function(onSuccess, onFailure) {
// ...
// uh-oh, I failed
if(onFailure) {
onFailure(err);
}
else {
// well, that probably wasn't too important anyway...
}
}
foo(function() { console.log("success!"); } /* no second argument... */);
Run Code Online (Sandbox Code Playgroud)
请注意,在同步编码(例如,大多数Java)中,要发生这种情况要困难得多.Catch块强制执行得更好,如果异常转义,它会转到未捕获的异常处理程序,该处理程序默认会崩溃系统.在节点中也是如此,除了在上面的范例中,没有抛出异常,它可能被吞噬.
强大的社区公约可以在我上面的简单例子中解决它,但是约定不能完全解决这个问题.参见例如支持方法的Q promise库done.
Q.fcall(promisedStep1)
.then(promisedStep2)
.then(promisedStep3)
.then(promisedStep4)
.then(function (value4) {
// Do something with value4
})
.catch(function (error) {
// Handle any error from all above steps
})
.done();
Run Code Online (Sandbox Code Playgroud)
done那里的调用指示promise链抛出任何未处理的异常(如果catch块丢失,或者catch块本身抛出).但是程序员完全有责任调用done,因为只有程序员知道链完成的时间.如果程序员忘记调用done错误将会挂在promise链中.我有真正的生产错误; 我同意,这是一个严重的问题.
我会说实话,这篇文章中的很多内容对我来说没什么意义.但我是一位经验丰富的Node.js程序员,这是我能想到的唯一可能意味着的东西.