2013-08-09 31 views
12

Cân nhắc tôi có một mảng của các đối tượng và những lời hứa, một cái gì đó như:Cách sử dụng Q.all() với một loạt các lời hứa phức tạp?

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

Bây giờ khi gọi tôi Q.all(arr) và trả về giá trị đối tượng trong then(), không có gì của xảy ra và vẫn mảng của tôi chứa các đối tượng hứa hẹn. Có cách nào để làm việc với Q.all() và các mảng phức tạp như vậy không?

Trả lời

19

Đó là cách Q được cho là hoạt động.
Để có được tất cả các giá trị, không phải là lời hứa, bạn có thể sử dụng .spread():

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

Mỗi đối số của các spread() callback sẽ là kết quả của từng lời hứa, trong trật tự của nó.

Nếu bạn nghĩ rằng bạn sẽ có rất nhiều hứa hẹn trong mảng như vậy, vòng lặp thông qua các tham số được cung cấp trong then() và thay thế những lời hứa với giá trị của nó:

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

làm việc tuyệt vời –

+3

nếu bạn muốn sử dụng '. spread() 'và không có kích thước cố định của mảng promisses, bạn có thể nhận được các giá trị của tất cả các lời hứa từ thuộc tính' arguments', bên trong hàm thành công của '.spread()'. Tất cả hàm node.js có một đối tượng đối số bên trong chúng, và đối tượng này có tất cả các tham số được truyền cho hàm này trên lời gọi hiện tại. –

Các vấn đề liên quan