我已经没有处理这种嵌套返回情况的想法了。 我试图找出通过promise从后端检索的数组是否包含数组中的元素。 这有效:
function isNameTaken() {
var duplicateFound = 0;
for (var i = 0; i < $scope.entities.length; i++) {
if ($scope.entities[i].name === $scope.myName) {
duplicateFound = 1;
}
}
return duplicateFound;
}
我想调整它,以便在比较之前刷新数组。我有一个检索它的方法,它解析为一个promise。现在,我可以将整个事物包装成.then包装但是我无法从外部访问我的duplicateFound变量到内部函数的异步性质。
这就是我想要的工作:
function isNameTaken() {
return loadEntities().$promise.then(function(entities) {
var duplicateFound = 0;
for (var i = 0; i < entities.length; i++) {
if (entities[i].name === $scope.myName) {
duplicateFound = 1;
}
}
return duplicateFound;
});
}
当承诺解决时,内部部分完美无瑕地工作,但整个函数总是解析为真,因为return loadEntities()
部分并没有将我封闭的返回值的内容传递给我,而是承诺本身。没有它,它总是解析为假(我认为它是未定义的)。
所以简而言之。第一个有效。如何在此方法之外获得duplicateFound
的值?
答案 0 :(得分:2)
整个功能总是解析为真
不,它不会返回true
。它确实返回一个布尔值的承诺,可能履行true
(或false
或完全拒绝)。这个承诺当然是一个真正的价值,所以你不能在if
条件内使用它。
相反,您必须调整调用代码以预测承诺,并在检查值之前让它等待解析。当然,这会使您的整个函数(以及调用它的所有函数)异步。
return isNameTaken().then(function(taken) {
if (taken)
…
else
…
}); // yields another promise for the result of the callback