1

我对 angularjs 的承诺有疑问,也许有人可以指出我正确的方向。我的控制器中有一个验证函数,如果一切正常,它应该返回 true,如果有问题,则返回 false。单页应用程序在这个假设上工作,所以我不能轻易改变这个假设......

window.customerValidation = function ($scope, $rootScope, $alert, $q) {
        var isValidated = false;


        if (!$scope.scopeData.customer.nationalId && !$scope.scopeData.customer.passportNumber && !$scope.scopeData.customer.driverLicenseNumber) {
            $alert.error("Please enter at least one identification info.");
            return false;
        }


        $scope.scopeData.customer.checkForDuplicateIdentity().then(function () {
            var customer = $scope.scopeData.customer;
            if (!customer.idValidated) {
                $alert.error(customer.idValidationMessage);
            }

            if (!customer.idValidated)
            {
                return false;
            }

            if ($scope.customerDataForm && $scope.customerDataForm.$error && $scope.customerDataForm.$error.required) {
                var missingFields = [];
                angular.forEach($scope.customerDataForm.$error.required, function (value, key) {
                    missingFields.push("-" + value.$name);
                });

                $alert.error("Please fill in the all required fields.\r\n" + missingFields.join("\r\n"));
            }
            else if ($scope.customerDataForm && $scope.customerDataForm.$error && $scope.customerDataForm.$error.email) {
                var invalidEmailFields = [];
                angular.forEach($scope.customerDataForm.$error.email, function (value, key) {
                    invalidEmailFields.push("-" + value.$name);
                });

                $alert.error("Please enter valid e-mail addresses.\r\n" + invalidEmailFields.join("\r\n"));
            }
            else if (!Date.parse($scope.scopeData.customer.dateOfBirth)) {
                $alert.error("Please enter a valid date for Date of Birth.");
            }
            else {
                $scope.scopeData.customer.updateIndividualCustomerInfoRequest();
                $scope.scopeData.customer.updateOrder();
                $rootScope.customerName = $scope.scopeData.customer.firstName + " " + $scope.scopeData.customer.lastName;
                isValidated = true;
            }

        });

        return isValidated;


    };

一切正常,直到最近需求发生变化,我正在尝试检查服务器以查看之前系统中是否使用过 id 值。因此我必须对服务器进行异步调用并检查它,你可以看到我使用了 $scope.scopeData.customer.checkForDuplicateIdentity() 方法并承诺让异步调用工作。

调用工作正常我测试过,唯一的问题是我的 customerValidation 方法在异步调用完成之前完成并一直返回 false。也就是说

return isValidated 行总是在 isValidated 变为真之前执行。

我不能让外部返回语句等待异步调用完成。如果我从内部函数返回 isValidated,它不会将值返回给 customerValidation 函数。有人可以告诉我如何实现这一目标吗?

4

2 回答 2

0

调用异步函数的函数本身必须是异步函数。更改window.customerValidation,使其返回一个承诺。

  • 消除var isValidated = false;
  • 替换return falsereturn $q.reject()第 7 行
  • 在前面添加return$scope.scopeData.customer.checkForDuplicateIdentity()
  • 在您提供的回调中thenreturn验证通过throw时,失败时出错

然后在window.customerValidationreplace的调用者中

if (window.customerValidation()) {
    // validation passed
} else {
    // validation failed
}

经过

window.customerValidation()
    .then(function () {
        // validation passed
    })
    .catch(function (error) {
        // validation failed
    })
于 2014-08-19T14:45:04.483 回答
-1

您始终可以使用 javascript 提供的超时功能,例如

setTimeout(function {DO_SOMETHING}, 50);

这将在调用函数之前等待 50 毫秒。这样您就可以等待异步调用完成。

希望这可以帮助。

于 2014-07-22T12:24:05.347 回答