2014-09-15 21 views
10

Nếu tôi thực hiện đoạn mã sau với Node.jsPromises Bluebird Tham gia hành vi

var Promise = require('bluebird'); 

Promise.join(
    function A() { console.log("A"); }, 
    function B() { console.log("B"); } 
).done(
    function done() { console.log("done");} 
); 

Giao diện điều khiển sẽ đăng nhập

B 
done 

Tuy nhiên tôi mong chờ

A 
B 
done 

hoặc

B 
A 
done 

Nếu thiết lập điểm ngắt trong chức năng A, nó sẽ không bao giờ đạt được. Tại sao nó xử lý B nhưng không phải là A?

Trả lời

16

Promise.join mất hứa hẹn như tất cả các đối số của nó nhưng đối số cuối cùng của nó, là hàm.

Promise.join(Promise.delay(100), request("http://...com"), function(_, res){ 
     // 100 ms have passed and the request has returned. 
}); 

Bạn đang nuôi nó hai chức năng nên nó như sau:

  • Thực hiện một lời hứa trên function A() { ... } - về cơ bản trả lại một lời hứa qua nó
  • Khi hoàn thành công việc (ngay lập tức) thực hiện cuối cùng đối số, function B() {... } ghi nhật ký.

Xem tài liệu:

Promise.join(Promise|Thenable|value promises..., Function handler) -> Promise

Đối phối hợp nhiều lời hứa rời rạc đồng thời. Trong khi .all() là tốt để xử lý một danh sách kích thước động của các lời hứa đồng nhất, Promise.tham gia là dễ dàng hơn nhiều (và performant hơn) để sử dụng khi bạn có một số tiền cố định của lời hứa rời rạc mà bạn muốn phối hợp đồng thời, ví dụ:

var Promise = require("bluebird");

var join = Promise.join;

join(getPictures(), getComments(), getTweets(),

          function(pictures, comments, tweets) {

          console.log("in total: " + pictures.length + comments.length + tweets.length);

});


Cập nhật:

JSRishe đã đưa ra một cách thông minh để giải quyết loại này của mẫu in this answer mà trông giống như sau:

Promise.delay(100).return(request("http://...com").then(function(res){ 
    // 100 ms have passed and the request has returned 
}); 

Điều này làm việc vì yêu cầu đã xảy ra trước khi trả về chậm trễ vì hàm được gọi trong cùng phạm vi.

+1

Có điều gì '.join()' làm điều đó '.all()' không thể thực hiện? Hay nó chỉ là một cú pháp khác? – jfriend00

+5

@ jfriend00 'Promise.join (p1, p2, ..., pn, fn)' hoạt động như 'Promise.all ([p1, p2, ..., pn]). Spread (fn)' ngoại trừ nó nhanh hơn một chút . Điều này rất hữu ích cho một số cố định của lời hứa và là đường đẹp cho việc sử dụng các lời hứa như proxy: 'var p1 = asyncOp(); var p2 = p1.then (otherOp); var p3 = p2.then (một lần nữa); Promise.join (p1, p2, p3, hàm (r1, r2, r3) {... '. Một lợi thế khác mà nó có là thông tin kiểu tốt hơn trong các ngôn ngữ như TypeScript vì nó dễ phân tích tĩnh hơn. –

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