Angularjs:函数不返回bolean值,即使webApi给出的响应为true

时间:2015-12-15 07:31:11

标签: angularjs

此我的加价代码

<button id="btnUploadFiles" class="col-lg-offset-1 col-lg-2 col-md-6 col-sm-4  btn primaryButton" data-ng-click="uploadFilesToPdm()">
                    <span class=" btn-circle"></span>
                    Upload
                </button>

我的控制器代码

$scope.uploadFilesToPdm = function () {
            if (validateLoad()){do something further...}
        }

function validateLoad() {
            selectedItems = {
                EnvironmentId: 52,
                ApplicationId: 23,
                UserId: ""
            }
            var data = fileUploadService.validateLoad.save({}, selectedItems);
            data.$promise.then(function (response) {
                if (!response.isValid) {
                    alert(warning.messageMandatoryFileLoad + response.requiredFileType);
                }
                return response.isValid;
            }, function (error) {
            });
        }

我的WebApi方法返回true并且工作正常。 并且在ValidateLoad()方法中也会捕获响应。

然而,在uploadFilesToPdm中,如果条件无法评估并且函数不会继续“进一步做某事......”。如果我遗漏了什么,请建议。

3 个答案:

答案 0 :(得分:0)

您可以通过返回承诺来处理它:

$scope.uploadFilesToPdm = function() {
  validateLoad().then(function(response) {
    if (!response.isValid) {
      return alert(warning.messageMandatoryFileLoad + response.requiredFileType);
    }
    //do something further..
  }, function(error) {});
}

function validateLoad() {
  selectedItems = {
    EnvironmentId: 52,
    ApplicationId: 23,
    UserId: ""
  }
  return fileUploadService.validateLoad.save({}, selectedItems).$promise;
}

答案 1 :(得分:0)

你的validateLoad()函数没有返回任何内容,这意味着它会有效地返回underfined,这是假的。

您需要从该函数返回一个布尔值。但那是不可能的,因为你只会在函数返回后很久才知道布尔值。只有在文件上传完成后才会知道布尔值。所以你可以返回的是布尔的承诺。但是你无法检查承诺是真是假。您只能检查它是否已解析为true或false:

$scope.uploadFilesToPdm = function () {
    validateLoad().then(function(valid) {
        if (valid) {do something further...}
    });
};


function validateLoad() {
    selectedItems = {
        EnvironmentId: 52,
        ApplicationId: 23,
        UserId: ""
    }

    var data = fileUploadService.validateLoad.save({}, selectedItems);
    return data.$promise.then(function (response) {
        if (!response.isValid) {
            alert(warning.messageMandatoryFileLoad + response.requiredFileType);
        }
        return response.isValid;
    });
}

阅读the blog post我写了关于承诺以及如何避免其陷阱的文章。

答案 2 :(得分:0)

正如卢卡斯在评论中所说:你需要“等待”异步电话才能完成。在您的情况下实现这一目标的最简单方法是从validateLoad()函数返回承诺,就像TJ的答案所示。

还有另一种方法可以使用$ q,它是一个反模式,但有时用于代码分离。

function validateLoad() {
  q = $q.defered();

        selectedItems = {
            EnvironmentId: 52,
            ApplicationId: 23,
            UserId: ""
        }
        var data = fileUploadService.validateLoad.save({}, selectedItems);
        return data.$promise.then(function (response) {
            if (!response.isValid) {
                alert(warning.messageMandatoryFileLoad + response.requiredFileType);
                q.reject(false);
            }
            q.resolve(response.isValid);
        });

   return q.promise;
}

在这种情况下,您创建另一个承诺,然后返回,然后在$scope.uploadFilesToPdm函数中使用。