附上回报价值和承诺

时间:2015-09-16 16:48:31

标签: javascript angularjs promise

我已经没有处理这种嵌套返回情况的想法了。 我试图找出通过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的值?

1 个答案:

答案 0 :(得分:2)

  

整个功能总是解析为真

不,它不会返回true。它确实返回一个布尔值的承诺,可能履行true(或false或完全拒绝)。这个承诺当然是一个真正的价值,所以你不能在if条件内使用它。

相反,您必须调整调用代码以预测承诺,并在检查值之前让它等待解析。当然,这会使您的整个函数(以及调用它的所有函数)异步。

return isNameTaken().then(function(taken) {
    if (taken)
        …
    else
        …
}); // yields another promise for the result of the callback