2014-10-22 63 views
1

我写的承诺下这种风格在doc
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(); 确保承诺错误太多?

的catch子句将捕获包括错别字任何错误。 然而,根据nodejs dos:

通过的抛在JavaScript中是如何工作的本质,几乎从来没有以任何方式安全地“拿起您离开的地方”,没有泄漏引用,或创造一些其他种类的未定义的脆性状态。应对抛出的错误的最安全方法是关闭该过程。

某种差错就扔出去,如果我们在回调风格编写代码,但不能在承诺的风格
这真是困惑我。在承诺书写时,我应该如何避免泄漏的参考文献。

谢谢〜

+0

如果你有像打开的文件句柄那样需要清理的东西,那么你必须在打开的文件句柄的范围内有一个'.catch()',这样你就可以在引发异常时清除它们。这只是您作为程序员的责任。在nodejs中,文件句柄不会自行清理。与套接字等其他资源一样。 – jfriend00 2014-10-22 02:16:24

+0

在链中的每个范围内,你都必须问自己这个问题 - 如果在这里抛出异常,是否有我需要清理的东西。如果答案是肯定的,那么你必须在那里发现异常。清理完成后,您可以重新抛出异常。 – jfriend00 2014-10-22 02:18:52

回答

1

的例子显示了良好的诺言链,包括使用.done(),以确保任何未处理的异常从承诺链抛向外面的应用。 就参考和错误处理而言:承诺链只保证将错误转发至.catch回调。如果在抛出错误时没有办法清理状态 - 那么你运气不好。例如

Q.fncall(function firstStep() { 
 
    var fs = open file reference 
 
    foo.bar; // generates ReferenceError 
 
}).then(function somethingElse() { 
 
    ... 
 
}).catch(function (err) { 
 
    // we have caught ReferenceError 
 
    // but we cannot clean up open fs reference! 
 
}).done();

我们所捕获的错误,但catch处理不能关闭fs参考。这就是说,即使有了承诺,我们也必须考虑如何在发生错误时清理资源。

+0

很好的例子。但我们应该如何处理?重新抛出它让这个过程死亡? – bpceee 2014-10-22 02:44:18

+0

@bpceee如果您希望节点具有合理的性能,您应该明确处理您的错误。否则,由于Node服务器的启动时间很慢,所以您处于非常有问题的位置。 – 2014-10-22 10:36:17

+0

@BenjaminGruenbaum你说得对,但是如果我们发现一个意想不到的错误呢。说它是从第三部分库中抛出的,并且可能会引入泄漏。我认为我们应该让这个过程在这种情况下死亡。当您使用回调风格进行编程时,您不需要考虑一件事情。 – bpceee 2014-10-22 10:41:37