2016-08-03 8 views
-1

Ich habe ein etwas kompliziertes Szenario und ich verstehe nicht ganz, warum mein Aufruf an Q.all keine Reihe von aufgelösten Versprechen zurückgibt. Es ist eine Mischung aus jQuery $.ajax Anrufe und Q. Anrufe. Hier ist die Einstellung:Q.all() liefert kein Array aufgelöster Werte

var saveThing1 = function(){ 
    return $.ajax({...}); 
} 
var saveThing2 = function(){ 
    return $ajax({...}); 
} 
var deleteThing2 = function(){ 
    return $.ajax({...}); 
} 

saveThing1.then(function(){ 
    var promiseArr = [saveThing2(), saveThing2(), deleteThing2()]; 
    return Q.all(promiseArr); 
}).then(function(response){ 
    var result1 = response[0]; 
    var result2 = response[1]; 
    var result3 = response[2]; 
}); 

From the Q docs:

promise.all()

Gibt ein Versprechen, die mit einem Array mit den Erfüllungswert jedes Versprechen erfüllt ist, oder wird mit dem gleichen Ablehnungsgrund abgelehnt, wie das erste Versprechen abgelehnt wurde.

Der Wert von response endet in diesem Fall als das einzige Versprechen anstelle des Arrays der Versprechenswerte. Dies ist, was die Chrome Dev-Tools erzeugt, wenn ich den Debugger anhalten und melden Sie sich, was der response Wert ist:

Promise {} 
    inspect:() 
    promiseDispatch:(resolve, op, operands) 
    valueOf:() 

andere Sache, die ich noch in meinem Kopf bin Kratzen ist, dass die .then während die Netzwerk getroffen wird Anfragen sind noch ausstehend, was bedeutet, dass die Versprechen in dem Array, das an Q.all übergeben wurde, ebenfalls anhängig sein sollten ...

+0

Sie benötigen Funktionen aufgerufen werden (zB 'saveThing1() then'.) Für ein Versprechen –

+0

zurückgegeben werden' saveThing1.then () 'sollte' saveThing1() sein. then() '. – jfriend00

+1

jQuery Ajax Versprechen sind ein verrücktes Biest. Sie lösen sich nicht auf einen einzelnen Wert auf (was völlig nicht standardgemäß ist), was manchmal wirklich Dinge durcheinander bringen kann. – jfriend00

Antwort

2

.all wird nichts mit einer Funktion tun, es erfordert eine Promise (oder ein Promise-ähnliches Objekt). Sie übergeben gerade eine Funktion, kein Versprechen. Damit dies funktioniert, müssen alle Ihre Funktionen aufgerufen werden:

var saveThing1 = function(){ 
    return $.ajax({...}); 
} 
var saveThing2 = function(){ 
    return $ajax({...}); 
} 
var deleteThing2 = function(){ 
    return $.ajax({...}); 
} 

saveThing1().then(function(){ 
    // populate the array with returned promises, not functions that return promises 
    var promiseArr = [saveThing2(), saveThing2(), deleteThing2()]; 
    return Q.all(promiseArr); 
}).then(function(response){ 
    var result1 = response[0]; 
    var result2 = response[1]; 
    var result3 = response[2]; 
}); 
+0

Entschuldigung, sie werden in meinem Code aufgerufen. Ich verallgemeinere es hier (offensichtlich) und schnitt einige der aufgeblähten/nicht verwandten Dinge aus. Ich habe den Beispielcode aktualisiert. – jkinz

Verwandte Themen