2016-10-12 3 views
0

So ein XHR innerhalb einer Schleife ausgeführt wird und ich möchte eine Funktion ausführen, nachdem alle XHR abgeschlossen sind, habe ich dies mit Versprechen wie folgt versucht.Lösen Sie Versprechen von einer Schleife mit jQuery

Das Problem ist die Umleitung passiert, bevor der AJAX abgeschlossen ist, was fehlt mir?

+0

ich sah, dass Sie jQuery im Titel angegeben, aber nur für historische Zwecke, können Sie dies auf eine "bessere" Art und Weise tun und mit besser ich meine bessere Lesbarkeit und Erweiterbarkeit. 'q.all ([loadSomething(), loadAnotherThing()]) .spread (function (etwas, ein anderer) { DoSomethingOnThem (etwas, ein anderer); });' Wo 'loadSomething(), loadAnotherThing() 'sind zwei Versprechen und' q.all' ist aus der folgenden Versprechens-Bibliothek: https://github.com/kriskowal/q –

Antwort

2

Wenn ich mich richtig erinnere, akzeptiert jQuery .when() Methode keine Array Versprechen als Argument, sondern einzelne Argumente statt. Das bedeutet nur, Sie müssen die Art und Weise ändern, davon Aufruf:

$.when.apply(null, promises).then(function(){ 
      window.location.href = '/cart?edit_order=true' 
}) 

Function.prototype.apply Verwendung automatisch eine Array nehmen und jeden Wert setzt diesen Array als einzelne Argumente in die aufgerufene Funktion, in diesem Fall , .when(). Effektive Verbreitung der Argumente.

Sie können auch einige ECMAScript Magie tun und ein wenig teilweise Anwendung für das Erstellen:

var when = Function.prototype.apply.bind($.when, null); 

..und dann rufen Sie einfach

when(promises).then(function() { ... 
+0

Sie meinen, bewerben, die die Argumente verbreitet? –

+1

Sie können auch '$ .when (.. verspricht)' in den letzten Versionen von ES –

+0

Sicher, aber Sie "können" auch native Versprechungen und Pfeilfunktionen und alles, aber dann sollten Sie dringend die Verwendung eines Pre-empfehlen oder transpiler. Destructering wird in Browser-Versionen vorerst nicht umfassend unterstützt. – jAndy

Verwandte Themen