Ich lese über Aufgeschobene und Versprechen und stoße immer wieder darauf $.when.apply($, someArray)
. Ich bin mir ein wenig unklar, was dies genau bewirkt, und suche nach einer Erklärung, dass eine Zeile genau funktioniert (nicht das gesamte Code-Snippet). Hier ist ein Zusammenhang:
var data = [1,2,3,4]; // the ids coming back from serviceA
var processItemsDeferred = [];
for(var i = 0; i < data.length; i++){
processItemsDeferred.push(processItem(data[i]));
}
$.when.apply($, processItemsDeferred).then(everythingDone);
function processItem(data) {
var dfd = $.Deferred();
console.log('called processItem');
//in the real world, this would probably make an AJAX call.
setTimeout(function() { dfd.resolve() }, 2000);
return dfd.promise();
}
function everythingDone(){
console.log('processed all items');
}
javascript
jquery
asynchronous
promise
Manafire
quelle
quelle
.done()
kann anstelle von.then
in diesem Fall nur FYI_.when
damit Sie es nicht verwenden müssenapply
.apply
: developer.mozilla.org/en-US/docs/JavaScript/Reference/… .Antworten:
.apply
wird verwendet, um eine Funktion mit einem Array von Argumenten aufzurufen. Es nimmt jedes Element im Array und verwendet jedes als Parameter für die Funktion..apply
kann auch den Kontext (this
) innerhalb einer Funktion ändern .Also, lass uns nehmen
$.when
. Es wird verwendet, um zu sagen "wenn all diese Versprechen gelöst sind ... etwas tun". Es dauert eine unendliche (variable) Anzahl von Parametern.In Ihrem Fall haben Sie eine Reihe von Versprechungen; Sie wissen nicht, an wie viele Parameter Sie übergeben
$.when
. Das Array selbst an zu übergeben$.when
würde nicht funktionieren, da erwartet wird, dass seine Parameter Versprechen sind, kein Array.Das ist , wo
.apply
kommt in . Es das Array nimmt, und Anrufe$.when
mit jedem Element als Parameter (und stellt sicher , dass diethis
eingestellt istjQuery
/$
), es so ist, dann alles funktioniert :-)quelle
$.when
Erstellen ausgeführt und warten nur, bis alle fertig sind, bevor Sie fortfahren.$.when($, arrayOfPromises).done(...)
und$.when(null, arrayOfPromises).done(...)
(die ich beide als Lösungsvorschläge in den Foren gefunden habe ...)$ .when nimmt eine beliebige Anzahl von Parametern an und wird aufgelöst, wenn alle diese aufgelöst wurden.
anyFunction .apply (thisValue, arrayParameters) ruft die Funktion anyFunction auf, die ihren Kontext festlegt (thisValue ist dies innerhalb dieses Funktionsaufrufs) und übergibt alle Objekte in arrayParameters als einzelne Parameter.
Beispielsweise:
Ist das gleiche wie:
Mit der Apply- Aufrufmethode können Sie jedoch ein Array mit einer unbekannten Anzahl von Parametern übergeben. (In Ihrem Code sagen Sie, dass Ihre Daten von einem Dienst stammen, dann ist dies die einzige Möglichkeit, $ .when aufzurufen. )
quelle
Hier ist der Code vollständig dokumentiert.
quelle
$.when.apply($, array)
ist nicht dasselbe wie$.when(array)
. Es ist das gleiche wie:$.when(array[0], array[1], ...)
Leider kann ich euch nicht zustimmen.
Wird anrufen
everythingDone
, sobald ein Aufgeschobener abgelehnt wird , auch wenn andere aufgeschobene Rückstände ausstehen .Hier ist das vollständige Skript (ich empfehle http://jsfiddle.net/ ):
Ist das ein Fehler? Ich würde dies gerne so verwenden, wie es der Herr oben beschrieben hat.
quelle
Vielleicht kann jemand dies nützlich finden:
EverythingDone wird bei Ablehnung nicht aufgerufen
quelle
$ .wenn es allein möglich ist, einen Rückruf aufzurufen, wenn alle an ihn weitergegebenen Versprechen gelöst / abgelehnt werden. Normalerweise ist $ .wenn eine variable Anzahl von Argumenten verwendet wird. Wenn Sie .apply verwenden, können Sie ein Array von Argumenten übergeben. Dies ist sehr leistungsfähig. Weitere Informationen zu .apply: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply
quelle
Vielen Dank für Ihre elegante Lösung:
Nur ein Punkt: Wenn
resolveWith
Sie einige Parameter abrufen, wird dies aufgrund des anfänglichen Versprechens, das auf undefiniert festgelegt ist, unterbrochen. Was ich getan habe, damit es funktioniert:quelle