【发布时间】:2016-03-01 01:35:22
【问题描述】:
我的承诺问题
我是Promises 的新手,我一直在阅读Q Documentation,上面写着:
当您到达承诺链的末尾时,您应该返回最后一个承诺或结束链。
我在我的代码中以Q.Promise 方式定义了一个Promise,并使用以下console.logs 来注销执行跟踪:
function foo(){
return Q.Promise(function(resolve, reject) {
doSomething()
.then(function() {
console.log('1');
return doSomething1();
})
.then(function() {
console.log('2');
return doSomething2();
})
.then(function() {
console.log('3');
return doSomething3();
})
.catch(function(err) {
console.log('catch!!');
reject(err);
})
.done(function() {
console.log('done!!');
resolve();
});
});
}
如果每个doSomethingN() 都正确执行,一切都会按预期进行,并且我会得到预期的跟踪:
1
2
3
done!!
但是万一doSomethingN() 中的任何一个失败:
foo() 工作正常,因为错误函数回调是在 reject(err) 发生时运行的回调函数:
foo().then(function() { /* */ }, function(err) { /* this runs! */ });
我得到以下跟踪(即当doSomething1() 失败时):
1
catch!!
done!!
我的问题
一开始我的想法是这样的:
好的,让我们在
.done()和.catch()方法中处理链接成功 和失败。如果一切顺利,.done()的回调将被执行,promise 将被解决。如果在任何时候出现错误,.catch()的回调将被执行并且承诺将被拒绝 - 因此,done()将不会被执行。
我想我遗漏了一些关于.done() 工作原理的信息……因为通过查看我的日志记录跟踪,我意识到.done() 似乎总是在执行——是否有错误和.catch()执行与否 - 这是我没有预料到的。
因此,在那之后,我删除了.done() 的回调,现在删除了foo():
- 如果在链执行期间有
error则有效 - 如果一切正常,则无法正常工作
我应该重新考虑什么以及如何/应该让它发挥作用?
【问题讨论】:
-
你的问题不在于
done,而在于catch。捕获错误意味着您已经处理了它,并且从.catch(…)返回的承诺 - 您将.done()附加到的承诺 - 将会实现! -
@Bergi 恐怕我不明白您在第二条评论中要解释什么...
.catch()有什么问题? -
它返回一个最终将被履行的承诺,这就是为什么你的
done即使出现错误也会运行的原因。看看Chained promises not passing on rejection -
@Bergi 您提供的有关该主题的链接非常有用!
标签: javascript node.js promise q