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 が true になる前に実行されます。
外部の return ステートメントを非同期呼び出しの完了まで待機させることはできません。内部関数から isValidated を返すと、customerValidation 関数に値が返されません。誰かがこれを達成する方法を教えてもらえますか?