如何访问回调函数之外的异步angularjs服务数据

How to access asynchronous angularjs service data out of the call back function

本文关键字:异步 angularjs 数据 服务 函数 何访问 访问 回调      更新时间:2024-01-22

我有一个表单提交,需要单独验证我的电子邮件id。根据电子邮件Id验证(使用validationService),我将提交表格,并从我的控制器呼叫formSubmissionService

我想在我的formController 中编码这样的逻辑

validationService.getEmailValidationResult.then(function(data){
    $scope.validEmailId = data.exists;
});
if($scope.validEmailId == true){
   formSubmissionService.submitForm().then(function(data){
      $scope.form.submitted = data;
   });
}
if($scope.form.submitted){
    $location.path('formSubmissionResponse');
}

在从我以前的帖子中得到一些更新后,我知道无法在回调函数之外访问$scopevalidEmailId。

所以我的代码会像这个一样被重写

validationService.getEmailValidationResult.then(function(data){
    $scope.validEmailId = data.exists;
    if($scope.validEmailId){
        formSubmissionService.submitForm.then(function(data){
            $scope.form.submitted = data;
            if($scope.form.submitted){
               $location.path('formSubmissionResponse');
            }
        )}; 
    }
});

有没有什么方法可以实现上述逻辑,或者重写后的代码可以进一步改进?

在重定向时,您可能不需要/不想分配给$scope

validationService.getEmailValidationResult().then(function(data){
    if (!data.exists) {
        return $q.reject(new Error('bad email!'));
    }
    return formSubmissionService.submitForm();
})
.then(function(submit) {
    if (!submit) {
        return $q.reject(new Error('error submitting'));
    }
    $location.path('formSubmissionResponse');
})
.catch(function(e) {
    // error
});

您可以将其压平一点:

validationService.getEmailValidationResult.then(function(data){
    $scope.validEmailId = data.exists;
    if($scope.validEmailId){
       return formSubmissionService.submitForm();
    } else return $q.reject();
}).then(function(data){
     $scope.form.submitted = data;
     if($scope.form.submitted){
        $location.path('formSubmissionResponse');
     }
});

了解更多信息:http://solutionoptimist.com/2013/12/27/javascript-promise-chains-2/