重试后如何继续保证链?

时间:2016-01-06 07:58:08

标签: angularjs angular-promise restangular

我正在使用restangular来对我的后端进行多次调用,我依赖于第一次执行后续调用的结果。

我正在尝试设置重试逻辑,因此在重试成功后执行后续请求。到目前为止,这是我的代码:

reefService.createGitLabProject(formData)
  .then(function(apiResponse) {
    $scope.apiStatus.messages.push({'direction': 'in', 'body': apiResponse.result});
    $scope.progressValue += 1;
    var gitLabProject = {
      'id': apiResponse.data.id,
      'http_url_to_repo': apiResponse.data.http_url_to_repo,
      'ssh_url_to_repo': apiResponse.data.ssh_url_to_repo
    };
    // add deploy key
    reefService.addGitLabDeployKey(gitLabProject)
      .then(function(apiResponse) {
        $scope.apiStatus.messages.push({'direction': 'in', 'body': apiResponse.result});
        $scope.progressValue += 1;
      })
      .catch(function(apiError) {
        $scope.apiStatus.errors.push(apiError);
      });
    // add web hook
    reefService.addGitLabProjectHook(gitLabProject)
      .then(function(apiResponse) {
        $scope.apiStatus.messages.push({'direction': 'in', 'body': apiResponse.result});
        $scope.progressValue += 1;
      })
      .catch(function(apiError) {
        $scope.apiStatus.errors.push(apiError);
      });
  // failed to create project
  })
  .catch(function(apiError) {
    $scope.apiStatus.errors.push(apiError);
  });

手动调用重试,它从apiError传递$scope.apiStatus.errors restangular对象。我正在使用以下内容:

$scope.retryRequest = function(error){
 var restAngularConf = error.config;
 $http(restAngularConf)
  .then(function(apiResponse) {
    $scope.progressValue += 1;
    // add response to messages
    $scope.apiStatus.messages.push({'direction': 'in', 'body': apiResponse.data.result});
    // delete error from errors array
    var ix = $scope.apiStatus.errors.indexOf(error);
    $scope.apiStatus.errors.splice(ix, 1);
  })
  .catch(function(apiError) {
    toaster.pop('error', 'Retry Error', apiError.data.message);
  });
};

它基本上会收到apiError并使用$http中的数据运行apiError.config来调用(网址,发布数据等)。这适用于没有addGitLabDeployKeyaddGitLabProjectHook等依赖项的调用,我无法设置如何设置createGitLabProject以便在将错误传递给$scope.retryRequest之后请求完成,addGitLabDeployKeyaddGitLabProjectHook继续。

如何在$q中设置createGitLabProject服务,以便在重试后继续请求链?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

看来我错过了承诺点,我需要在函数中包装它并传递函数重试数组并以这种方式重试...