2017-06-29 3 views
0

Basierend auf this answer Ich versuche derzeit, einen Dienst zu erstellen, der Daten zurückgibt, auch wenn die Anforderung nicht erfolgreich war, aber es abgelaufen ist.Timeout-Handler gibt Daten in angularjs zurück

this.getStatus = function() 
    { 
     var timeoutPromise = $timeout(function() { 
      canceler.resolve(); 
      console.log("Timed out"); 
     },250); 

     var canceler = $q.defer(); 

     $http.get("data.js", {timeout: canceler.promise}).success(function(data){ 
      console.log(data); 

      $timeout.cancel(timeoutPromise); 

      return data; 
     }); 
    }; 

Dies ist, wie der Dienst mit der $http Anfrage

genannt wird
var promises = [ 
    firstService.getStatus(), 
    secondService.getStatus(), 
    thirdService.getStatus() 
]; 

$q.all(promises) 
    .then(function (serviceResults) { 
     //process Data in case of success 
     console.log("Result First Service: "+ serviceResults[0]); 
     console.log("Result Second Service: "+ serviceResults[1]); 
     console.log("Result third Service: "+ serviceResults[2]); 
    }) 
    .catch(function() { 
     //process Mock data in case of Failure 
    }); 

Es soll die Daten aus der Antwort zurück, wenn entweder die Anforderung erfolgreich ist oder einige Platzhalter-Daten im Fall eines Timeout.
Wie also ist es möglich, Daten zurückzugeben, wenn die Anfrage abläuft?

+0

Warum möchten Sie Ihre Daten zeigen, wenn es zu einem bestimmten Zeitpunkt während der Anfrage erreicht wurde? Was ist, wenn die Daten länger oder kürzer als Ihr Timeout sind? Sie können 'catch' verwenden, um zu sehen, ob Ihre Anfrage fehlschlägt,' .catch (function (response) {}) 'dann bearbeiten Sie es dort oder machen Sie was auch immer, wenn es die Anfrage fehlgeschlagen sieht. – MrNew

Antwort

0

Sie könnten:

this.getStatus = function() { 
    var deferred = $q.defer(); 
    var timeoutPromise = $timeout(function() { 
     deferred.resolve(
      // MOCKED DATA HERE 
     ); 
     console.log("Timed out"); 
    }, 250); 

    $http.get("data.js", {timeout: canceler.promise}).then(function(data){ 
     $timeout.cancel(timeoutPromise); 
     deferred.resolve(data); 
    }).catch(deferred.reject); 

    return deferred.promise; 
}; 

diese Weise, wenn die Anforderung erfolgreich löst es mit den Antwortdaten. Wenn es Timeouts gibt, löst es mit den verspotteten Daten auf. Wenn vor dem Timeout ein anderer Fehler auftritt, wird das Versprechen mit dem Antwortfehler abgelehnt.

Verwandte Themen