2013-08-09 20 views
12

Considerare Ho un array di oggetti e promesse, qualcosa di simile:Come utilizzare Q.all() con una serie complessa di promesse?

[{ 
    a: 1 
}, { 
    a: 4 
}, { 
    a: 4 
}, { 
    promiseSend: [Function], 
    valueOf: [Function] 
}, { 
    promiseSend: [Function], 
    valueOf: [Function] 
}] 

Ora, quando ho chiamata Q.all(arr) e restituire il valore dell'oggetto in then(), nulla di accadere e ancora il mio array contiene oggetti promessa. C'è un modo per lavorare con lo Q.all() e un array così complesso?

risposta

19

Ecco come Q dovrebbe funzionare.
Per ottenere tutti i valori, non le promesse, si possono utilizzare .spread():

Q.all([a, b]).spread(function (a, b) { 
    return a + b; 
}); 

Ogni argomento della spread() callback sarà il risultato di ogni promessa, nel suo ordine.

Se pensate che avrete un sacco di promesse in tale varietà, ciclo attraverso l'argomento previsto then() e sostituire le promesse con il suo valore:

Q.all(promises).then(function(result) { 
    for (var i = 0, len = result.length; i < len; i++) { 
     if (Q.isPromise(result[i])) { 
      result[i] = result[i].valueOf(); 
     } 
    } 

    // Next step! 
}); 
+0

lavorando meravigliosamente –

+3

se si desidera utilizzare il '. spread() 'e non hanno una dimensione fissa dell'array di promisses, è possibile ottenere i valori di tutte le promesse dalla proprietà' arguments', all'interno della funzione success di '.spread()'. Tutta la funzione node.js ha un oggetto arguments al loro interno e questo oggetto ha tutti i parametri passati a questa funzione al richiamo corrente. –

Problemi correlati