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){
});
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
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
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