2016-01-06 64 views
0

我使用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); 
    }); 

重試手動調用,它是從$scope.apiStatus.errors傳遞apiError 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,並運行在apiError.config(URL,POST數據等)$http使用呼叫數據。這對撥號沒有任何依賴關係,如addGitLabDeployKeyaddGitLabProjectHook,我很難解決如何設置createGitLabProject,以便在其錯誤傳遞到$scope.retryRequest和請求完成後,addGitLabDeployKeyaddGitLabProjectHook繼續。

如何在createGitLabProject中設置$q服務,讓請求鏈在重試後繼續?

非常感謝您的幫助!

回答

0

看來我錯過了承諾的重點,我需要將其包裝在函數中,並將函數傳遞給重試數組並重試它...