2015-06-02 13 views
6

Bluebird có chức năng promisifyAll là "Khuyến khích toàn bộ đối tượng bằng cách xem các thuộc tính của đối tượng và tạo một tương đương async của từng chức năng trên đối tượng và chuỗi mẫu của nó."Bluebird PromisifyAll không có bất kỳ hậu tố Async nào, tức là thay thế các chức năng gốc có thể?

Nó tạo các hàm có hậu tố Async.

Có thể thay thế hoàn toàn các chức năng cũ không? Các hàm được thay thế hoạt động giống như các hàm ban đầu với phần bổ sung mà chúng cũng trả về một Promise, vì vậy tôi nghĩ sẽ an toàn khi chỉ thay thế hoàn toàn các hàm cũ.

var object = {}; 
object.fn = function(arg, cb) { cb(null,1) }; 
Bluebird.promisifyAll(object); 

object.fn  // do not want 
object.fnAsync // => should replace `object.fn` 

Có một tùy chọn để chỉ định một tùy chọn tùy chỉnh suffix nhưng tiếc là nó không làm việc cho chuỗi rỗng

Bluebird.promisifyAll(object, {suffix: ''}); 

RangeError: suffix must be a valid identifier 
+0

Tôi nghĩ, bạn nên đăng một yêu cầu tính năng trên [theo dõi vấn đề bluebird] (https://github.com/petkaantonov/bluebird/issues). –

+0

Tôi không nghĩ rằng điều này là có thể, bởi vì hiện tại, việc tạo ra các phương thức chỉ gọi 'this.fn (…)' để chúng bị bắt trong một đệ quy vô hạn nếu bạn ghi đè 'fn'. – Bergi

Trả lời

5

Vấn đề là nếu nó đi nguyên mẫu và đặt *Async chức năng - bạn sẽ cần bản sao hoàn toàn mới của mọi đối tượng trong chuỗi mẫu thử nghiệm có khả năng sẽ thất bại vì các thư viện trả về các đối tượng của riêng chúng.

Tức là - nếu bạn đang sử dụng Mongoose và bạn đang nhận được đối tượng bộ sưu tập - thư viện sẽ không biết trả về phiên bản được hứa hẹn - bạn sẽ có bản sao riêng của phiên bản được quảng bá nhưng thư viện sẽ không chơi tốt với nó. Ngoài ra, thư viện cũng gọi các hàm riêng của nó và thay đổi chữ ký của chúng sẽ phá vỡ rất nhiều mã nội bộ.

Tất nhiên, nếu bạn cần điều này chỉ là một mức độ sâu bạn không quan tâm đến nguyên mẫu bạn không quan tâm về các cuộc gọi nội bộ - bạn có thể dễ dàng thực hiện nó:

Object.getOwnPropertyNames(object).forEach(function(key){ 
    object[key] = Promise.promisify(object[key]); 
}); 

Điều quan trọng là phải hiểu rằng đây không phải là trường hợp thông thường. Có những apporoaches khác (như làm cho hàm trả về một lời hứa nếu bạn bỏ qua gọi lại) nhưng nói chung chúng không đáng tin cậy lắm.

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