2017-01-23 2 views
0

Bearbeiten: Entschuldigung für die Beantworter, es stellt sich heraus, dass dies tatsächlich gültigen Code war, aber Anforderungen wurden abgefangen und aller Parameter entfernt.Senden mehrerer GET-Anforderungen mit wechselnden Parameter in AngularJS


Ich versuche, auf ein REST-API wiederholt HTTP GET-Anforderungen zu machen, auf dem Ausgang abhängig und die Lösung von this question verwendet hat.

Ich möchte jedoch einen der Parameter erhöhen, die ich in der Anfrage übergebe. Im Wesentlichen, die API-Seiten die Ausgabe und ich muss den Wert von entsprechend erhöhen.

Manuelle Anfragen funktionieren mit:

<URL>/board?startAt=50 

und geben zurück:

{"maxResults":50,"startAt":50,"isLast":true,"values":[list_of_values]} 

hier so weit mein Code ist:

:

function getHttpPromise(start_at) { 
    // This function recurses until the server returns isLast = true. 
    // 
    // Each iteration appends the values in response.values to 
    // $scope.boards. 
    test = $http({ 
        url: 'boards', 
        method: 'GET', 
        params: {'startAt': start_at.toString()} 
       }). 
     success(function (response) { 
      console.log(response); // the response contains startAt, which always has 
            // the initial value (0), rather than start_at's value 

      var values = response.values; 
      for (var i in values) { 
       var board = values[i]; 
       $scope.boards[board.id] = board; 
      } 

      if (response.isLast) { 
       // We have received all the boards. 
       return true; 
      } else { 
       // Increment start_at and return another http request promise. 
       start_at += response.maxResults; 
       return getHttpPromise(start_at); 
      } 
     } 
    ); 

    console.log(test); // params is correct here 

    return test; 
} 

Diese Funktion wird durch genannt wird

jiraWorkLog.controller('SprintSelectCtlr', 
function($scope, $http, $routeParams) { 
    $scope.init = function() { 
     $scope.boards = new Object(); 

     getHttpPromise(0).then(
      function (dummy_var) { 
      for (var board in $scope.boards) { 
       ... 
      } 
     } 
    ); 
} 
... 
); 
+0

was in der Konsole sehen Sie sehen, wenn Sie 'console.log tun (respo nse.maxResults); 'vor dem Hinzufügen zu' start_at'? Was sehen Sie, wenn Sie 'console.log (start_at);' vor und nach dem Wert inkrementieren? – Nope

+0

wo nennst du das ** getHttpPromise ** ?? – Aravind

+0

@Fran wird der Wert korrekt inkrementiert ('response.maxResults = 50' und' start_at = 0 => start_at = 50' etc.). @Aravind Ich habe meine Frage entsprechend bearbeitet. Es ist in unserem "SprintCtlr" -Objekt. –

Antwort

0

Die $http().success() ist veraltet. Sie sollten $http().then() verwenden.

Die then empfängt eine Funktion, als ein response Objekt übergeben wird, das eine Eigenschaft namens data hat. Dort finden Sie Ihre values.

können Sie lesen weiter here

nach dem Code gründlicher lesen, rate ich müssen Sie dieses Problem nicht rekursiv zu lösen. Wenn die Daten nicht seitenweise gesendet werden sollen, senden Sie vorab eine Anforderung für alle Datensätze.

Jetzt zu beantworten, warum Sie nur das erste Ergebnis erhalten: es ist, weil das das einzige Ding ist, das zurückgegeben wird und der rufende Kontrolleur. Sie geben ein Versprechen zurück, dass der Controller darauf wartet, gelöst zu werden. Alle anderen rekursiven Aufrufe werden erst ausgeführt, nachdem der Controller bereits ausgeführt wurde.

+0

Das Problem ist, dass meine Anfrage nicht korrekt gesendet wird, keinen Zugriff auf die Werte erhalten. Die Anfrage wird ständig mit 'startAt = 0' gesendet. –

+0

Jetzt, da Sie den Controller hinzugefügt haben, habe ich gesehen, dass Sie ihn mit einer hartcodierten 0 aufrufen. Deshalb wird die Anfrage immer mit 0 – idan

+0

In der Chrome-Entwickleransicht ausgeführt. Der Wert von "start_at" erhöht sich bei jedem folgenden Aufruf (um den richtigen Betrag). Die 0 sollte nur der Anfangswert im ersten Anruf sein, dachte ich. –

0

die Antwort hält alle http Sachen und Sie die Daten aus ihm heraus zu bekommen ...

Ich denke, dass der folgende Link Angular Http

ein anderes Problem, das Sie mit Ihrem Rekursion haben könnte helfen ist, dass Sie eine lokale Variable sind aktualisiert und es falsch verwenden ...

function getHttpPromise(start_at) { 
// This function recurses until the server returns isLast = true. 
// 
// Each iteration appends the values in response.values to 
// $scope.boards. 
test = $http({ 
       url: 'boards', 
       method: 'GET', 
       params: {'startAt': start_at.toString()} 
      }). 
    success(function (response) { 
     console.log(response.data); // the response contains startAt, which always has 
           // the initial value (0), rather than start_at's value 

     var values = response.data; 
     for (var i in values) { 
      var board = values[i]; 
      $scope.boards[board.id] = board; 
     } 

     if (response.data.isLast) { 
      // We have received all the boards. 
      return true; 
     } else { 
      // Increment start_at and return another http request promise. 
      return getHttpPromise(response.data.maxResults+1); 
     } 
    } 
); 

console.log(test); // params is correct here 

return test; 

}

+0

Wie ich unten gesagt habe, besteht das Problem darin, die Anfrage zu formulieren, nicht die Antwort zu analysieren. Die Antwort gültig ist (und richtig), aber die Anfrage Ich bin das Senden verwendet nicht die richtige 'startat = ' ich will. –

+0

versuchen Sie, Ihren Rekursionsaufruf als getHttpPromise zu aktualisieren (response.data.maxResults + 1); – silver

+0

'response.data.maxResults + 1' ist immer gleich (51). Der Wert 'start_at' wird korrekt inkrementiert, er wird in der GET-Anfrage nicht verwendet. –