2013-08-09 17 views
12

Rozważmy Mam tablicę obiektów i obietnic, coś jak:Jak korzystać z Q.all() z złożoną tablicą obietnic?

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

Teraz, gdy wezwanie ja Q.all(arr) i zwróci wartość obiektu w then(), nic się nie stało i nadal moja tablica zawiera obiekty obietnicy. Czy jest jakiś sposób pracy z Q.all() i tak złożonymi tablicami?

Odpowiedz

19

Tak właśnie ma działać Q.
Aby uzyskać wszystkie wartości, a nie obietnic, można użyć .spread():

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

Każdy argument spread() zwrotnego będzie wynik każdej obietnicy, w swoim postanowieniu.

Jeśli myślisz, że masz dużo obietnic w takiej tablicy, pętli thru argument podany w then() i zastąpić obietnice ze swojej wartości:

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

działa cudownie –

+3

jeśli chcesz użyć '. spread() 'i nie ma stałej wielkości tablicy obietnic, możesz uzyskać wartości wszystkich obietnic z właściwości' arguments', wewnątrz funkcji sukcesu '.spread()'. Wszystkie funkcje node.js mają wewnątrz obiektu argumenty, a ten obiekt ma wszystkie parametry przekazane do tej funkcji w bieżącym wywołaniu. –