我对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。这就是说
返回isValidated行总是在isValidated变为true之前执行。
我无法使外部返回语句等待异步调用的完成。如果我从内部函数返回isValidated,它将不会将值返回给customerValidation函数。有人能告诉我如何实现这个目标吗?
答案 0 :(得分:0)
调用异步函数的函数本身必须是异步函数。更改window.customerValidation
,以便返回承诺。
var isValidated = false;
return false
上替换return $q.reject()
$scope.scopeData.customer.checkForDuplicateIdentity()
then
,return
的回调内,以及throw
失败时的错误然后在window.customerValidation
替换
if (window.customerValidation()) {
// validation passed
} else {
// validation failed
}
通过
window.customerValidation()
.then(function () {
// validation passed
})
.catch(function (error) {
// validation failed
})
答案 1 :(得分:-1)
您始终可以使用javascript提供的超时功能,例如
setTimeout(function {DO_SOMETHING}, 50);
这将在调用函数前等待50ms。这样您就可以等待异步调用完成。
希望这有帮助。