|
|
|
'use strict';
|
|
|
|
|
|
|
|
angular.module('angularPromisesApp')
|
|
|
|
.controller('MainCtrl', function ($scope, $http, $q, $timeout) {
|
|
|
|
|
|
|
|
|
|
|
|
$scope.timeout = 500 // timeout in ms for each request
|
|
|
|
|
|
|
|
|
|
|
|
$scope.loadData = function() {
|
|
|
|
$scope.result = null
|
|
|
|
|
|
|
|
$http.get('/api/ngparis/_all_docs', {
|
|
|
|
params: {include_docs: true},
|
|
|
|
timeout: $scope.timeout})
|
|
|
|
.success(function(result){ // .success = .then(onFulfilled)
|
|
|
|
$scope.result = result
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
$scope.loadDataWithFailOver = function() {
|
|
|
|
var requestTimeout = $scope.timeout;
|
|
|
|
var retries = 10;
|
|
|
|
|
|
|
|
var doRequest = function () {
|
|
|
|
var timedOut;
|
|
|
|
|
|
|
|
/*
|
|
|
|
This deferred will handle the timeout of requests
|
|
|
|
and notify the promise handlers
|
|
|
|
*/
|
|
|
|
var tryRequest = $q.defer();
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
Timeout + retries of requests is actually processed here
|
|
|
|
with $timeout
|
|
|
|
*/
|
|
|
|
var timeout = $timeout(function(){
|
|
|
|
timedOut = true;
|
|
|
|
if (retries === 0) {
|
|
|
|
tryRequest.resolve('timeout')
|
|
|
|
console.log('timeout abort request');
|
|
|
|
} else {
|
|
|
|
console.log('trying new request')
|
|
|
|
retries--;
|
|
|
|
tryRequest.resolve('timeout')
|
|
|
|
doRequest();
|
|
|
|
}
|
|
|
|
// }, requestTimeout);
|
|
|
|
|
|
|
|
// Using exponential max timeout latency
|
|
|
|
}, Math.exp(requestTimeout/100));
|
|
|
|
requestTimeout += 50;
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
If the promise of the request is fulfilled or
|
|
|
|
failed, then cancel the timeout/retries processing
|
|
|
|
*/
|
|
|
|
tryRequest.promise.then(undefined, function(){
|
|
|
|
$timeout.cancel(timeout);
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// The API call using $http
|
|
|
|
$http.get('/api/ngparis/_all_docs', {
|
|
|
|
params: {include_docs: true},
|
|
|
|
timeout: tryRequest.promise // A promise that will abort the request if resolved
|
|
|
|
}).success(function(result){
|
|
|
|
if (timedOut)
|
|
|
|
return;
|
|
|
|
else {
|
|
|
|
console.log('success')
|
|
|
|
tryRequest.reject('request success')
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
doRequest();
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|