var done = this.async()
và done(blah)
là một thủ thuật thông minh để trả lại một giá trị lấy từ không đồng bộ cuộc gọi (ví dụ $.get
) trong vòng một chức năng đồng bộ.
Chúng ta hãy xem một ví dụ:
var getText = function() {
return "hello";
};
var text = getText();
Đó là một chức năng cuộc gọi khá đơn giản như vậy không có câu đố ở đây. Tuy nhiên, điều gì sẽ xảy ra nếu bạn cần tìm nạp văn bản một cách không đồng bộ trong hàm getText()?
var getText = function() {
return $.get('<some-url>', function(text) {
return text;
}); // ??????
};
gọi tới getText()
không trả lại văn bản bạn muốn nhận. Nó trả về đối tượng lời hứa của jquery.
Vậy làm cách nào để chúng tôi thực hiện getText()
trả về văn bản nhận được từ cuộc gọi $.get()
?
var getText = function() {
var done = this.async();
$.get('<some-url>', function(text) {
done(text);
});
};
var text = getText(); // you get the expected text
Magic, phải không?
Tôi không biết hoạt động bên trong của cuộc gọi this.async()
. Tôi không biết nếu có một thư viện cung cấp chức năng đó, nhưng bạn có thể thấy rằng Backbone.LayoutManager sử dụng thủ thuật này https://github.com/tbranyen/backbone.layoutmanager/blob/master/backbone.layoutmanager.js (tìm kiếm this.async).
Ngoài ra, Tim Branyen (tác giả của bố cục xương sống) một thời gian ngắn nói về nó trong video hướng dẫn của mình (http://vimeo.com/32765088 khoảng 14:00 - 15:00). Trong video, Tim nói Ben Alman đã nghĩ ra điều đó. Hãy xem điều này cũng như https://github.com/cowboy/javascript-sync-async-foreach
Tôi nghĩ rằng đó là một mẹo khá gọn gàng để trộn các chức năng đồng bộ hóa và đồng bộ hóa.
Chúc mừng,
Nguồn
2012-11-02 04:59:21
Đó không phải là chức năng tích hợp sẵn. Nó phải được cung cấp bởi một số thư viện/khung. – user123444555621