2012-04-20 29 views
15

Tôi đang tìm kiếm một cách để thực hiện một nhiệm vụ nhất định và có nghĩa là, đi từTránh .call() và .apply() sử dụng .bind()

jQuery.when.apply(null, promiseArray).done(...) 

để

when(promiseArray).done(...) 

Như bạn có thể biết, .bind() có thể được sử dụng để tạo ra một cái gì đó như đối số mặc định và cũng làm một số công cụ khá tiện lợi. Ví dụ, thay vì lúc nào cũng gọi

var toStr = Object.prototype.toString; 
// ... 
toStr.call([]) // [object Array] 

chúng ta có thể làm điều đó như

var toStr = Function.prototype.call.bind(Object.prototype.toString); 
toStr([]) // [object Array] 

này là khá mát mẻ (thậm chí nếu có một penality hiệu suất gọi .bind() như thế này, tôi biết điều đó và tôi nhận thức được nó), nhưng tôi thực sự không thể thực hiện được nó cho cuộc gọi jQuery .when. Nếu bạn có một số lượng các đối tượng lời hứa không xác định, bạn thường đẩy chúng vào một mảng, sau đó có thể chuyển chúng vào .when như trong đoạn mã đầu tiên của tôi ở trên.

tôi đang làm điều này cho đến nay:

var when = Function.prototype.apply.bind($.when); 

Bây giờ chúng ta có thể đi như

when(null, promiseArray).done(...) 

này hoạt động, nhưng tôi cũng muốn thoát khỏi sự cần thiết phải vượt qua trong null rõ ràng mỗi thời gian. Vì vậy, tôi đã cố gắng

var when = Function.prototype.apply.bind($.when.call.bind(null)); 

nhưng đó ném vào tôi:

"TypeError: Function.prototype.apply called on incompatible null" 

Tôi đoán tôi đang ngồi trên này quá lâu bây giờ và không thể nghĩ thẳng nữa. Nó cảm thấy như có một giải pháp dễ dàng. Tôi không muốn sử dụng bất kỳ chức năng bổ sung để giải quyết vấn đề này, tôi hoàn toàn sẽ prefere một giải pháp sử dụng .bind().

Xem ví dụ hoàn chỉnh ở đây: http://jsfiddle.net/pp26L/

+1

'.bind ($ .Khi, null) '? – Raynos

+0

@Raynos: yay, chà muối vào bản ngã bị thương của tôi ..: p – jAndy

Trả lời

10

này nên làm việc:

when = Function.prototype.apply.bind($.when, null); 

Bạn chỉ ràng buộc (hoặc cà ri, nếu bạn thích) đối số đầu tiên của .bind và sửa chữa nó để null.

Fiddle.

+0

omg, tôi chắc chắn rằng tôi đã làm điều đó tại một số điểm. Làm thế nào tôi có thể bỏ lỡ nó? Ít nhất tôi biết đó là một giải pháp khá dễ dàng cho một câu hỏi lớn. Cảm ơn @Jon! – jAndy

+0

@jAndy: Xem xét rằng JS của bạn tốt hơn nhiều so với tôi, rõ ràng là bạn đã bỏ lỡ nó do mệt mỏi. Chúc mừng. – Jon

7

bind chấp nhận số lượng đối số thay đổi, vì vậy bạn có thể áp dụng một phần phương thức. Vì vậy, thay vì:

var when = Function.prototype.apply.bind($.when); 

Làm điều này:

var when = Function.prototype.apply.bind($.when , null); 

Và jsfiddle Cập nhật: http://jsfiddle.net/pp26L/2/

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