2016-04-29 16 views
0

Ich habe eine Web-App, mit der der Benutzer mehrere Dateien durch eine Dateieingabe auswählen kann. Sobald der Benutzer die Dateien auswählt, lade ich diese Dateien einzeln über meine Rest-API hoch. Wenn der Benutzer jedoch im IE mehrere Dateien auf einmal auswählt (> 10), bricht der IE einige der Anfragen nach dem Zufallsprinzip ab (eine Frage wurde früher ohne Antworten gesendet here). Die einzige Möglichkeit, das zu beheben, besteht darin, diese http-Anfragen zu drosseln.Drossel verspricht in AngularJS

Wenn beispielsweise ein Benutzer 20 Dateien auswählt, möchte ich jeweils 5 davon gleichzeitig auslösen. Sobald alle 5 Versprechen gemacht sind, fange mit der nächsten Gruppe von 5 an. Wie kannst du das machen?

+0

überprüfen Sie dies: http://stackoverflow.com/questions/26596835/how-do-i-throttle-http-requests-in-angularjs –

Antwort

0

Ja, es ist möglich, Versprechen zu verwenden. Ich habe ein Beispiel für eine Funktion, die dies in meinem Repository-Repository von es6 promise patterns hilft, unter https://github.com/DukeyToo/es6-promise-patterns#resource-limiter. Leider habe ich nicht eine Version für $q geschrieben, aber es sollte :)

In Ihrem Beispiel nicht allzu schwer sein, zu übersetzen, wäre es so etwas wie folgt verwendet werden:

var limiter = resourceLimiter(5); 
for (var i=0; i<20; i++) { 
    limiter.take().then(function() { 
    return $http({..do your request .}) 
    }.then(function(response) { 
    limiter.give(); 
    //.. then do whatever with response 
    }); 
} 

Grundsätzlich

, Die .take löst auf, wenn eine Ressource verfügbar ist, und verwendet eine der fünf Ressourcen. Die .give gibt die Ressource zurück und löst die nächste .take zur Auflösung aus. Das Konzept ist einfach genug, obwohl die resourceLimiter Implementierung schwierig ist.