Iteration über array bei forEach-Schleife ist alles erledigt
Ich versuche zu iterieren über ein array, das ich-Konstrukt aus mehreren http-Aufrufe innerhalb eines angular.forEach()
die Funktion
$scope.ticket_stats = function(){
//cleaning variables
$scope.data_set = [];
$scope.closed_tickets = [];
//fetching time stamps (epoch)
$scope.time_frame = time_period.days(7);
//calling data using time stamps
angular.forEach($scope.time_frame, function(item) {
//debug
console.log(item);
var promise = tickets.status("closed", item);
promise.success(function(data){
console.log(data);
$scope.closed_tickets.push(data[0].datapoints[0][0]); //returns a numerical value
});
});
//SEE MESSAGE BELOW
$scope.data_set.push($scope.closed_tickets);
}
die Letzte Zeile $scope.data_set.push()
funktioniert, aber Inkrement selbst im Laufe der Zeit einmal fordert Daten zurück. Ich möchte diese Zeile einmal ausgeführt werden soll alles, was innerhalb der for-Each-Schleife ist alles erledigt. Ich brauche zum Durchlaufen der $scope.closed_tickets
array afteward zu spielen (neben -) Daten hinein und der Aufbau eines zweiten array.
hier sind die Dienstleistungen, die in dieser Funktion verwendet:
//CALL TICKETS STATS
app.service('tickets', function($http){
this.status = function(status, date){
var one_snap = date - 100;
var url = "/url/render?format=json&target=sum(stats.tickets."+status+")&from="+one_snap+"&until="+date+"";
return $http.get(url);
};
});
//TIME STAMPS MATHS
app.service('time_period', function(){
var currentDate = parseInt((new Date).getTime()/1000);
this.days = function(number){
var pending = [];
for (var i = number; i > 0; i--) {
pending.push(currentDate - (87677*i));
}
return pending;
};
});
Suche ich nach Informationen und fand heraus, über die $q.all()
service aber nicht geschafft, diese Arbeit zu machen, wie ich will.
Irgendwelche Tipps, wäre willkommen!
Danke!
- werfen Sie einen Blick auf asynchrone Verarbeitung libs wie
async.js
- dies ist vergleichbar mit dem $q-service. Dies ist nur so, dass ich sehe es nicht funktioniert. Eine ausführlichere Antwort wäre willkommen.
- Nicht wirklich,
$q.all
wird aufgerufen, wenn alle zusagen sind behoben, aber Sie werden parallel ausgeführt.async
konnte dir helfen sequentialize Sie, oder Sie können rufen Sie die nächste, wenn die Vorherige fertig ist mit$q.when
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die $q.alle warten mehrere ansynchronous Veranstaltungen (Versprechen) fertig zu stellen.
Zunächst
deferred
repräsentiert ein Stück code, das wird nehmen Sie eine unbekannte Menge an Zeit für die Ausführung (asynchron).deferred.resolve(data)
besagt einfach, dass der code fertig ist. Daten könnte alles sein, ein Objekt, string, was auch immer, aber es ist in der Regel die Ergebnisse der asynchronen code. Ebenfalls können Sie ablehnen ein Versprechen mitdeferred.reject(data)
(vielleicht ein Fehler war, ausgelöst durch die sever). Wieder Daten können alles sein, aber hier sollte es wohl die error-response.deferred.promise
nur gibt ein promise-Objekt. Das promise-Objekt können Sie festlegen, Rückrufe wie.then(successFunction, errorFunction)
damit Sie wissen, ein Stück code Ausführung beendet hat, bevor Sie zusuccessFunction
(odererrorFunction
im Fall eines Ausfalls). In unserem Fall$q
hat die.all
Methode, die wartet, für eine Reihe von Versprechungen zu beenden, dann gibt Sie die Ergebnisse aller Verheißungen, wie Sie ein array.Vergessen Sie nicht, um zu injizieren, die
$q
service.deferred.resolve
innerhalb voncall2.success
. Sonst müssten Sie$q.all([call1, call2])
in Ihrem forEach-Schleife. Wo Ruf 1 und Ruf 2 hätten jeweils ein deferred-Objekt und beheben nennen.Versuchen, eine Reihe von Versprechungen, ohne Sie zu lösen noch. Aggregieren Sie mit $q.alle(). Nach aggregierten Versprechen lösen Sie eine Iteration durch das array von diese Versprechungen wieder. Jetzt sind Sie sicher, dass Sie alle aufgelöst werden.
Vielleicht ist dies nicht der effizienteste Weg, dies zu tun, aber ich denke, dass sollte dein problem lösen.
Obwohl Sie erwähnen, $q.alles hat nicht funktioniert für Sie, so sehe ich nicht, warum sollte es nicht, so würde ich dies tun.
Im Grunde, die Sie zuordnen möchten ein array von Dingen (Zeitstempel), um einige andere Dinge (verspricht in diesem Fall, da haben wir asynchrone Aufrufe) und einige Aktionen auf dem resultierenden array.
Verwenden wir jetzt
$q.all
zu warten, für alle verspricht, zu beschließen: