【发布时间】:2014-08-19 22:45:04
【问题描述】:
我对 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 变为真之前执行。
我无法让外部 return 语句等待异步调用完成。如果我从内部函数返回 isValidated,它不会将值返回给 customerValidation 函数。有人可以告诉我如何实现这一目标吗?
【问题讨论】:
-
返回承诺而不是布尔值。
-
你的意思是我应该在customerValidation函数中返回promise?
-
你是通过什么方式使用这个功能的?
-
验证方法被调用,返回值是否为真,显示下一个控制器视图。如果它是假的,错误消息被警告,显示没有任何变化。执行代码是通用的,适用于 6-7 个控制器,因此更改它并不容易,它期望返回一个布尔值
标签: javascript angularjs angular-promise