我在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:
由于throw如何在JavaScript中运行,因此几乎从来没有任何方法可以安全地从中断的位置继续运行,而不会泄漏引用,或创建其他类型的未定义的脆弱状态。响应抛出错误的最安全方法是关闭进程。
如果我们在回调样式中编写代码,但在promise样式中没有编写代码,则会抛出某些错误 这真让我困惑。在承诺写作时,我应该如何避免泄露参考文献。
感谢〜
答案 0 :(得分:1)
该示例显示了良好的承诺链,包括使用.done()
来确保从promise链中向外部应用程序抛出任何未处理的异常。
就引用和错误处理而言:promise链仅保证将错误转发到.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
引用。这就意味着即使有了承诺,我们也必须考虑如何在发生错误的情况下清理资源。