2016-07-27 20 views
1

Ich versuche gerade, eine Art Konfigurationsdienst zu schreiben. Der Dienst liefert einen Pfad zu einem anderen Server. Dieser Pfad wird anhand des empfangenen Pfades auf seine Gültigkeit mit einer Ping-Funktion getestet. Wenn der Pfad auf einen nicht vorhandenen Server zeigt, gibt es kein Versprechen und die gesamte App bleibt aufgrund von Aktionen stecken, die normalerweise stattfinden sollten, nachdem das Versprechen unter Verwendung einer .then(function (data){ }); im Code übermittelt wurde.
Gibt es also eine Möglichkeit, ein solches fehlendes/ausstehendes Versprechen einzufangen, um das Einfrieren meiner App zu verhindern?AngularJS catch ideling Versprechen

Hier ist der Code in der AngularController (durch Taste ausgelöst wird)

applicationPingService.ping(path) 
.then(function(successStatus){ 
    if(successStatus == true){ 

     //Some code here 

    } 
    else{ 
     //Some other code here 
    } 
}); 

Dies ist der gerufene Dienst.
Es dauert einen Pfad wie http://localhost:8080 und versucht, eine blank.html Seite zu erreichen, um den Statuscode zu überprüfen, wenn der Server aktiv ist oder nicht. Diese

app.service('applicationPingService', ['$http', '$q', 'globalValue', function($http, $q, globalValue) { 

    this.ping = function(path) 
    { 
     return $http({ 
      method: "GET", 
      url: path + "/blank.html" 
     }).then(function(response) 
     { 
      if(response.status == 200) 
      { 
       return true; 
      } 
      else{ 
       return false; 
      } 

     }); 
    }; 
}]); 

ist nur ein Beispiel, aber ich möchte auch eine universelle Art und Weise wissen, wie zu fangen Leerlauf und fehlenden Versprechen

Vielen Dank im Voraus

Antwort

0

Ich fand dieses Beispiel zu einem sehr guten tutorial page for promises:

var jqDeferred = jQuery.ajax('http://localhost/blank.html'); 

jqDeferred.then(function(response, statusText, xhrObj) { 
    alert('success'); 
}, function(xhrObj, textStatus, err) { 
    alert('error'); 
}); 

Manchmal dauert eine Serverantwort viel zu lange. Dann könnten Sie mit Ihrem eigenen Timeout arbeiten und folgendes verwenden:

Promise.race (Array); Machen Sie eine Zusage, die erfüllt, sobald ein Artikel erfüllt oder zurückweist, sobald ein Artikel zurückgewiesen wird, je nachdem, was zuerst passiert zuerst.

0

Es ist $q.race Verfahren in Angular 1.5, die das tut:

var timeoutPromise = $timeout(() => $q.reject('timeout'), 5000); 

$q.race([pingPromise, timeoutPromise]]).then(...); 
Verwandte Themen