我的Promise问题
我刚接触Promises
,并且一直在阅读Q文档,其中写道:
当你到达Promise链的末端时,应该返回最后一个Promise或结束该链。
我已经按照Q.Promise
的方式在我的代码中定义了一个Promise,并添加了以下console.log
以记录执行跟踪:
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) { /* 这里运行! */ });
当doSomething1()
失败时,我会得到以下跟踪信息:
1
catch!!
done!!
我的问题
我最初的想法是:
好的,让我们同时处理
.done()
和.catch()
方法中的链式 成功和失败。如果一切顺利,.done()
的回调函数将会被执行,承诺将得到解决。如果在任何时候出现错误,则会执行.catch()
的回调函数并拒绝承诺——因此,done()
将不会被执行。
我认为我对 .done()
的工作原理有所误解……因为通过查看我的日志跟踪,我意识到 .done()
似乎总是被执行——无论是否出现错误并执行了 .catch()
——这不是我预期的结果。
因此,在那之后,我移除了 .done()
的回调函数,现在 foo()
:
- 如果在链条执行过程中有一个
error
,它可以正常工作 - 如果一切正常工作,它就不能正常工作
我应该重新考虑什么?我如何使它工作?
Promise
构造函数反模式! - Bergidone
,而在于catch
。捕获错误意味着你已经处理了它,并且从.catch(…)
返回的 Promise - 也就是你附加.done()
的那个 Promise - 将会被实现! - Bergi.catch()
有什么问题吗? - charliebrownie