2017-05-03 1 views
1

Ich verwende Angular 1.6.3

Ich brauche 3 get-Anforderungen zu machen und schließlich zu prüfen, ob zumindest eine Erfolgsantwort gibt. Im Moment habe ich diesen Code geschrieben:

  var result = new Array(); 
     $http.get("link1", 
       { 
        "params": { 
         "email": user.email, 
        } 
       }).then(function (successResult) { 
       result[0] = false; 
      }, function (errorResult) { 
       result[0] = true; 
      }); 
      $http.get("link2", 
       { 
        "params": { 
         "email": user.email, 
        } 
       }).then(function (successResult) { 

       result[1] = false; 

      }, function (errorResult) { 

       result[1] = true; 

      }); 
      $http.get("link3", 
       { 
        "params": { 
         "email": user.email, 
        } 
       }).then(function (successResult) { 
       result[2] = false; 
      }, function (errorResult) { 
       result[2] = true; 
      }); 
      if(result[0] || result[1] || result[2]){ 
       error(); 
      } 

Aber manchmal eine von GET Anfragen gibt -1 als HTTP-Statuscode, wenn es 200 geben sollte. Ich weiß, dass alle $http Anfrage async sind und ich denke, das ist der Hauptgrund. Was ist der richtige Weg, um dieses Problem zu lösen?

+0

Ich habe AngularJS schon eine Weile nicht mehr gemacht, aber warum plazieren Sie Json nach dem Link in der $ http.get()? – tholo

+0

@tholo So können Sie Parameter hinzufügen wie 'google.com? Email = test @ email.com' – Loniks

+0

Oh ja, ich habe vergessen .. Machen Sie eine setTimeout() zwischen den Anfragen und das sollte eine Umgehung sein. – tholo

Antwort

1

Sie diese

var result = new Array(); 
$http.get("link1", 
     { 
      "params": { 
       "email": user.email, 
      } 
     }).then(function (successResult) { 
     result[0] = false; 
    }, function (errorResult) { 
     result[0] = true; 
    }).then($http.get("link2", 
     { 
      "params": { 
       "email": user.email, 
      } 
     }).then(function (successResult) { 

     result[1] = false; 

    }, function (errorResult) { 

     result[1] = true; 

    })).then(
    $http.get("link3", 
     { 
      "params": { 
       "email": user.email, 
      } 
     }).then(function (successResult) { 
     result[2] = false; 
    }, function (errorResult) { 
     result[2] = true; 
    })); 

verwenden kann, aber hier ist eine bessere Art und Weise mit Versprechen hier zu nennen, ist der Link zu der offiziellen Seite

https://docs.angularjs.org/api/ng/service/$http

+0

Dies verhindert die parallele Ausführung aller drei Ajax-Aufrufe. Der richtige Weg ist die Verwendung von $ q.all. Überprüfen Sie meine Lösung unter – Kalyan

+0

Aber manchmal eine der GET-Anfragen gibt -1 als Http Statuscode, wenn es 200 geben soll. Ich dachte von dieser Zeile, wenn einer der Anrufe fehlschlägt, möchte er nicht zum nächsten Anruf wechseln. Aber ja ich stimme zu, wenn er einen Parallelruf wünscht dann ist $ q.all besser dran. –

0

Durch die asynchrone Natur von HTTP-Anfragen, werden Sie viel besser dran sein, Versprechen richtig zu verwenden. Ich empfehle Promise.all(), die den Status der Antworten überprüfen können, sobald sie alle angekommen sind.

Alternativ können Sie eine Funktion verwenden, um jede Antwort zu überprüfen, wenn sie eintreffen (anstatt zu warten, bis alle Versprechen gelöst sind).

Zum Beispiel:

checkResponse(res) { 
    // logic here 
} 

$http.get('xxx').then(res => checkResponse(res)) 
$http.get('yyy').then(res => checkResponse(res)) 
$http.get('zzz').then(res => checkResponse(res)) 
2

richtige Weg, dies zu tun, ist $ q.all

Verwenden Sie den folgenden Code zu verwenden.

var promise1 = $http.get("link1", 
     { 
      "params": { 
       "email": user.email, 
      } 
     }); 
var promise2 = $http.get("link2", 
     { 
      "params": { 
       "email": user.email, 
      } 
     }); 
var promise3 = $http.get("link3", 
     { 
      "params": { 
       "email": user.email, 
      } 
     }); 

$q.all([ 
     promise1, 
     promise2, 
     promise3 
     ]).then(function(data) 
     { 

      // data[0] contains the response of the promise1 call 
      // data[1] contains the promise2 response 
      // data[2] contains the promise3 response. 
      $scope.variable = data; 
     }, 
     function(errorData){ 

     });