2014-09-08 7 views
6

Die offizielle restangular Dokumentation provides dieser Code Probe eine Anfrage im ErrorInterceptor zu wiederholen:Retry einen Restangular Anruf in einem Abfangjäger

var refreshAccesstoken = function() { 
    var deferred = $q.defer(); 

    // Refresh access-token logic 

    return deferred.promise; 
}; 

Restangular.setErrorInterceptor(function(response, deferred, responseHandler) { 
    if(response.status === 403) { 
     refreshAccesstoken().then(function() { 
      // Repeat the request and then call the handlers the usual way. 
      $http(response.config).then(responseHandler, deferred.reject); 
      // Be aware that no request interceptors are called this way. 
     }); 

     return false; // error handled 
    } 

    return true; // error not handled 
}); 

jedoch, wie es in den Kommentaren sagt, wird der zweite Versuch auslösen keine Abfangjäger weil es $ http direkt verwendet.

Gibt es eine Möglichkeit, die zweite Anfrage auch durch die Restangular-Pipeline zu gehen und den ErrorInterceptor auszuführen?

+1

können Sie ersetzen die $ HTTP (response.config) .then (responseHandler, deferred.reject); 'mit restApi Aufruf .. Verwenden Sie $ http Interzeptoren statt restangularen Interceptor, auch mit Restangular.Ich bevorzuge $ http Abfangjäger, weil alle angularjs api Wrapper wie Restangular intern $ http unter der Haube verwenden ... – harishr

+1

Die Frage ist ** über ** Wechsel von '$ http' zu 'Restangular' im Abfangjäger. Verwechseln Sie 'Restangular' nicht mit einem einfachen Restanruf. –

Antwort

4

Eigentlich sind die Anfragen mit Restangular Versprechungen gemacht, die nur einmal gelöst werden sollen. Sie können es im Falle einer Ablehnung nicht erneut senden.

ich nicht wirklich wissen, ob Sie ein wiederverwendbarer errorInterceptor oder nicht wollen, aber die Art, wie die Servicearbeiten scheint nicht einfach aus den response object config ein Restangular Objekt neu bauen zu können.

Eine Sache, die Sie tun können, ist der Hinweis auf Ihre Objekt speichern und dann in der Abfangjäger verwenden.

Sie sollten Ihre Gründe haben, aber ich muss Ihnen dies, weil im Falle des Scheiterns warnen und wenn es weiterhin besteht, Sie mit einer unendlichen Aufruf könnte am Ende, da die Restangular immer die errorInterceptor nennen.

Ich habe ein wenig Plunkr für die Demonstration verspottet, öffnen Sie einfach Ihre Netzwerk-Registerkarte und klicken Sie auf die Schaltfläche, sollten Sie sehen, alle Anfrage geht durch dort.

+0

Ich habe ein Szenario, wie wenn ich Fehlercode einige 200, wenn ich einige Post-Service, die ich muss einen Dienst anrufen (wie get), muss wieder den gleichen Post-Service aufrufen, in dem ich den Fehlercode 200 bekam –

1

Verwenden async.retry kann zu Ihrem Problem passen.

Nehmen wir an, Ihre asynchrone Funktion ist:

function apiCall(callback) { 
    Restangular.all('items').getList() 
    .then(function (res) { 
     // all is OK 
     callback(null, res); 
    }) 
    .catch(function (err) { 
     if (err.status === 403) { 
     // this one will bring async to retry apiMethod 
     return callback(err); 
     } 
     // others errors codes will not call apiMethod again 
     callback(null); 
    }); 
} 

Beispiel retry mit:

// async will try it 3 times 
async.retry(3, apiCall, function(err, result) { 
    // do something with the result 
}); 

async.doUntil könnten Sie auch interessieren könnten.

1

Es ist zu spät für eine Antwort, aber ich habe eine Lösung dafür gefunden, also werde ich es hier als mögliche Lösung erwähnen.

Es gibt einen Hinweis in dem folgenden Link, der besagt, dass Sie verwenden müssen.

https://github.com/mgonto/restangular/issues/1022

ich restangular offiziellen Beispiel wie folgt am Befestigungs:

Restangular.setErrorInterceptor(function(response, deferred, responseHandler) { 
    if(response.status === 403) { 
    refreshAccesstoken().then(function() { 
     // instead of using $http, I will use restangularizeElement as follow 
     // I still have no idea how is the best method to repeat the request after restangularized it. I am repeating it with a simple get 
     var request = Restangular.restangularizeElement('', response.data, url); 
     request.get().then(function() {}); 
    }); 
    return false; // error handled 
    } 

    return true; // error not handled 
}); 

Auf diese Weise, wenn wiederholte Anforderung einen Fehler verursachen, wird es wieder in restangular Fehler Abfangjäger gefangen werden.