Próbuję użyć resolve
w $routeProvider
, aby wyświetlić nową trasę tylko po zakończeniu żądania $http
. Jeśli żądanie zakończy się pomyślnie, obietnica wynikająca z metody $ http.post() zostanie rozwiązana, a widok zostanie wyrenderowany. Ale jeśli żądanie nie powiedzie się (timeout lub błąd wewnętrzny np.), Obietnica nigdy nie zostanie rozwiązana, a widok nigdy nie zostanie wyrenderowany. Jak radzić sobie z niepowodzeniem żądania przy użyciu resolve
?
najważniejszych części kodu jest poniżej:
app.js
$routeProvider.when('/warrantyResult', {
templateUrl : 'partials/warranty-result.html',
controller : 'WarrantyResultCtrl',
resolve : {
response : [ 'Warranty', function(Warranty) {
return Warranty.sendRequest();
} ]
}
});
controllers.js
angular.module('adocDemo.controllers', []).controller('HomeCtrl', [ '$scope', function($scope) {
} ]).controller('WarrantyCtrl', [ '$scope', '$http', '$location', 'Warranty', function($scope, $http, $location, Warranty) {
$scope.submitWarranty = function() {
$scope.loading = true;
Warranty.setRequestData($scope.data);
$location.path('/warrantyResult');
};
} ]).controller('WarrantyResultCtrl', [ '$scope', 'Warranty', function($scope, Warranty) {
$scope.request = Warranty.getRequestData();
$scope.response = Warranty.getResponseData();
} ]);
services.js
angular.module('adocDemo.services', []).factory('Warranty', [ '$http', '$timeout', function($http, $timeout) {
/**
* This service is used to query the Warranty Webmethod. The sendRequest
* method is automaticcaly called when the user is redirected to
* /warrantyResult route.
*/
var isDataSet = false;
var requestData = undefined;
var responseData = undefined;
return {
setRequestData : function(data) {
//Setting the data
isDataSet = true;
},
getRequestData : function() {
return requestData;
},
sendRequest : function(data) {
if(isDataSet) {
var request = $http.post('url/to/webservice', requestData);
request.success(function(data) {
responseData = data;
});
return request;
}
},
getResponseData : function() {
return responseData;
}
};
} ]);
wiem mógłbym użyć obietnicy a zaokrąglij wywołanie $ http i rozwiąż je, nawet jeśli żądanie jest niepowodzeniem, ale zastanawiam się, czy istnieje prostsze rozwiązanie.
Dzięki za czytanie i, miejmy nadzieję, że pomaga :)
Zależy od tego, jak zachowa się Twoja aplikacja, gdy rozwiązywanie się nie powiedzie? – Stewie
Najlepszym zachowaniem byłoby przekierowanie użytkownika na inną trasę (/ requestError?), Gdy rozstrzygnięcie nie powiedzie się. Można również wyświetlić/gwarancjiResult i kontroler tej trasy będzie odpowiedzialny za sprawdzenie, czy żądanie zakończyło się sukcesem, czy nie. – pdegand59