一般来说,角色和承诺相当新,我觉得我做的一切都是正确的,直到我读到了关于共同承诺的反模式。我也注意到我的代码变得非常难以理解和阅读。
BTW,使用Angular的Q实现。
在这个链中,我是否正确处理错误?我应该使用捕获吗?我该怎么办?我可以让我的代码更简洁吗?
编辑: 找不到谈论如何处理条件承诺的问题。所有其他stackoverflow问题都非常简单,没有像我的例子那样复杂的链接。希望这个问题可以帮助某人
function importantPromise(){
var deferred = $q.defer();
var importantVariable;
topLevelPromise().then(function(result) {
var secondResult = doSomeWork(result, importantVariable);
secondPromise(secondResult)
.then(function(result) {
deferred.resolve(result);
}, function(error) {
deferred.reject(error);
});
}, function(error) {
conditionalPromise(importantVariable)
.then(function(result) {
deferred.resolve(result);
}, function(error) {
deferred.reject(error);
});
});
return deferred.promise;
}
//Actually using the promise
importantPromise().then(function(result){
handleResult(result);
}, function(error){
handleError(error);
});
答案 0 :(得分:1)
好笑,我刚给我的团队发了一封电子邮件,说明这个错误。你为自己制造的东西太难了。就这样做:
function importantPromise(){
var importantVariable;
return topLevelPromise().then(function(result) {
var secondResult = doSomeWork(result, importantVariable);
return secondPromise(secondResult);
}).catch(function(error) {
return conditionalPromise(importantVariable);
});
}
这是承诺链的本质。
你可能在想,"不,如果我这样做,我的handleResult和handleError函数将被提前调用,使用promises而不是final值!"
不,不,不,porpoise-puss。 Promise-chaining意味着如果一个解析函数返回一个promise,那个promise将自行解析,并将其值传递给链中的下一个resolution-function。试试吧。