如何从回调函数中访问异步 angularjs 服务数据

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

我有一个表单提交,我需要单独验证我的电子邮件 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');
            }
        )}; 
    }
});

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

你可以把它压扁一点:

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/

在重定向时,您可能不会 need/want 分配给 $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
});