Angular 有条件的承诺
Angular conditional promises
对于 angular 项目,我必须将 promises 和 运行 嵌套到我不确定自己在做什么的情况下。
这是我的代码之一:
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 正在运行承诺函数。很多承诺和行动取决于条件。
我可以这样做并确保我的主要功能始终得到解决或拒绝吗?
我读到我们可以在 resolve 函数中传递 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;
});
不,不是。如果 Action2()
、Action3()
或 Action4()
中的一个执行了 "throw",并且拒绝了 $q.all(…)
承诺,您的第一个函数将永远挂起 - 那么您的延期永远不会得到解决.这是您在此处使用的 deferred antipattern 最常见的错误。
你的第二个函数确实缓解了这个问题,但仍然不必要地复杂。你根本不需要在这里延期!直接 return 承诺,然后使用 $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"
.
感谢您的回答,我可以在第一个代码版本上看到我的错误。我认为是 q.all 让我感到不安。
我阅读了延迟反模式。它说我们不必无缘无故地创建延迟对象。
简单的情况是这样的:
return Action1().then(function () {
return $q.all([Action2(),Action3(), Action4()]);
});
但是由于 if (data.condition) 我不能这样做。
我的第二个代码是唯一的方法吗?我是在案件中还是必须使用延迟?
它谈到了 "promisification",但是 Angular 我不知道这是否是一件好事(库似乎没有维护)。
干杯,
对于 angular 项目,我必须将 promises 和 运行 嵌套到我不确定自己在做什么的情况下。 这是我的代码之一:
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 正在运行承诺函数。很多承诺和行动取决于条件。 我可以这样做并确保我的主要功能始终得到解决或拒绝吗?
我读到我们可以在 resolve 函数中传递 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;
});
不,不是。如果 Action2()
、Action3()
或 Action4()
中的一个执行了 "throw",并且拒绝了 $q.all(…)
承诺,您的第一个函数将永远挂起 - 那么您的延期永远不会得到解决.这是您在此处使用的 deferred antipattern 最常见的错误。
你的第二个函数确实缓解了这个问题,但仍然不必要地复杂。你根本不需要在这里延期!直接 return 承诺,然后使用 $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"
.
感谢您的回答,我可以在第一个代码版本上看到我的错误。我认为是 q.all 让我感到不安。
我阅读了延迟反模式。它说我们不必无缘无故地创建延迟对象。
简单的情况是这样的:
return Action1().then(function () {
return $q.all([Action2(),Action3(), Action4()]);
});
但是由于 if (data.condition) 我不能这样做。 我的第二个代码是唯一的方法吗?我是在案件中还是必须使用延迟?
它谈到了 "promisification",但是 Angular 我不知道这是否是一件好事(库似乎没有维护)。
干杯,