对于一个有角度的项目,我必须嵌套承诺,我遇到了我不确定我在做什么的情况。 这是我的一个代码:
return Action1().then(function (data) {
var defer = $q.defer();
if (data.condition) {
$q.all([Action2(), Action3(), Action4()]).then(function () {
defer.resolve();
});
} else {
defer.reject("error_code");
}
return defer.promise;
});
Action1,Action2,Action3和Action4正在使用promises函数。这是很多承诺和行动取决于条件。 我可以这样做,并确保我的主要功能将始终被解决或拒绝吗?
我读到我们可以在promise函数中传递promise。 我可以这样做,这与上面相同:
return Action1().then(function (data) {
var defer = $q.defer();
if (data.condition) {
defer.resolve($q.all([Action2(), Action3(), Action4()]);
} else {
defer.reject("error_code");
}
return defer.promise;
});
答案 0 :(得分:3)
不,不是。如果Action2()
,Action3()
或Action4()
之一做了"抛出"并拒绝$q.all(…)
承诺,那么您的第一个函数将永远待定 - 您的延期是从来没有解决过。这是您在此处使用的deferred antipattern最常见的错误。
你的第二个功能确实缓解了这一点,但仍然是不必要的复杂功能。你根本不需要延期!只需直接返回承诺,然后使用$q.reject
:
return Action1().then(function (data) {
if (data.condition) {
return $q.all([Action2(), Action3(), Action4()]);
} else {
return $q.reject("error_code");
}
});
或者,在then
处理程序中发生这种情况时,您也可以使用throw "error_code"
。
答案 1 :(得分:1)
感谢您的回答,我可以在第一个代码版本上看到我的错误。我认为q.all会扰乱我。
我读了延迟反模式。它说我们不必无缘无故地创建延迟对象。
简单的例子就是:
return Action1().then(function () {
return $q.all([Action2(),Action3(), Action4()]);
});
但是由于if(data.condition)我无法做到。 我的第二个代码是唯一的方法吗?我是在案件还是我必须使用延期?
它讲的是" promisification",但是对于Angular,我不知道它是否是一件好事(libs似乎没有维护)。
干杯,