2017-09-18 3 views
0

Hallo, ich bin neu zu kantig und wollte Versprechungen verstehen. Ich habe 2 http get (verschachtelt) in einem anderen. Ich möchte den Wert der inneren Schleife verwenden, um eine Verbindung für die äußere get-Anweisung wie unten zu bilden.Weitergabe Wert von inneren Get-Anweisung zu out Get-Anweisung

Der Wert $ scope.content ist außerhalb der zweiten Schleife immer undefiniert oder null. Könnte jemand mir eine Möglichkeit vorschlagen, den Wert in die erste get-Anweisung zu übergeben.

Antwort

0

Eine $http.get oder eine asynchrone Operation wird nur im Hintergrund ausgeführt, und jede Anweisung, die Sie schreiben, wird nicht wirklich darauf warten, dass diese beendet wird.

Wenn Sie Code ausführen möchten, nachdem es fertig ist, müssen Sie die .then Methode der Promise es zurückgibt.

In diesem Fall möchten Sie wahrscheinlich warten, bis alle diese Vorgänge abgeschlossen sind, und dann Ihre und ähnliche Dinge aufrufen.

Um dies zu tun, speichern Sie die Versprechen von den Anforderungen zurückgegeben und warten auf sie mit $q.all zu lösen. Vergessen Sie nicht, $ q zu den Abhängigkeiten Ihres Controllers hinzuzufügen.

var fileRequests = []; 
for(...) { 
    fileRequests.push($http.get(fileUrl) 
    .then(function success(response) { ... return fileUrl; })) 
} 

$q.all(fileRequests).then(function(fileUrls) { .. $scope.loadTable() }) 

Sie auch $scope.content jedes Mal überschreiben, ich glaube, die URLs in $scope.fileTableData[i] speichern gemeint.

Voll Code:

 $scope.loadtable = function (task){ 
 

 
     var bgUrl = "cloudantlink"; 
 

 
     $http.get(bgUrl) 
 
     .success(function (response) { 
 
      var filePromises =[]; 
 
      for(var i =0;i<response.rows.length;i++){ 
 

 
       var fileUrl = "cloudantURL"; 
 

 
       // Saving the promises 
 
       filePromises[i] = $http.get(fileUrl, {responseType:'arraybuffer'}) 
 
       .then(function success(response) { 
 

 
        var file = new Blob([response], {type: 'application/pdf'}); 
 
        var fileURL = URL.createObjectURL(file); 
 

 
        // This will be the result when the promise is resolved 
 
        return $sce.trustAsResourceUrl(fileURL); 
 

 
       }, function error(data) { 
 
       }); 
 

 

 
      } 
 
      
 
      // Waiting for the promises 
 
      $q.all(filePromises).then(function(fileUrls) 
 
      { 
 
       // fileUrls contain the results returned by the success callback 
 
       $scope.TableData = fileUrls.map(function(url) { 
 
       return { 'download' : '<a href=\"'+url+'\">' + url+'</a>', }; 
 
       }) 
 
       $scope.loadTable(); 
 
      }) 
 
      
 

 
     }).error(function(data){ 
 

 
     });

+0

Ich denke nicht, was ich tun kann, dass als der reponse Typ ist ein Array-Puffer verwendet, um eine BLOB-URL von der inneren get-Anweisung zu erstellen. Ich habe es auch mit q.all versucht, aber nicht für mich gearbeitet. Der Wert ist in der Schleife vorhanden, lädt aber nur das zweite Mal, wenn ich zwischen Tabs navigiere. Es lädt nicht beim ersten Mal. – user6591323

+0

In Ihrem Code wird der Erfolgsrückruf innerhalb der Schleife nach der $ scope.TableData.push (TableEntry); und der $ scope.loadTable(); Zeile ausgeführt. Dies hat nichts mit dem Antworttyp und dem, was Sie damit machen, zu tun. Sie müssen entweder den fileTableEntry-Erstellungscode in den success-Callback verschieben oder diese blob-URLs in einem Array speichern und sie nach dem Lösen der Versprechen im $ q.all-Callback hinzufügen. – yscik

+0

Das Problem, $ scope.TableData.push nicht verschieben zu können (TableEntry); und die $ scope.loadTable(); innerhalb der zweiten get ist, weil ich mehr Zeilen für die Tabellenerstellung aus der Antwort der ersten get-Anweisung hinzufügen möchte. Könnten Sie auch etwas detaillierter auf den Code Teil sein? Ich habe Versprechungen gemacht, aber was Sie vorschlagen, könnte anders sein. – user6591323