Cách thức gọi lại bị trì hoãn hoạt động là mỗi khi bạn thêm một cuộc gọi lại vào nó, cuộc gọi lại đó được đẩy đến một mảng. Sau đó, khi phương thức .resolve()
hoặc .resolveWith()
được gọi trên đối tượng bị trì hoãn, tất cả các .done()
cuộc gọi lại trong mảng được thực hiện theo thứ tự.
Bây giờ chúng ta có thể xem đối tượng Trì hoãn là gì. Lấy đoạn trích dưới đây làm ví dụ.
var deferred = $.Deferred();
var promise = deferred.promise();
Những gì chúng ta có bây giờ là một đối tượng bị trì hoãn và đối tượng hứa hẹn của đối tượng bị trì hoãn. Các đối tượng thu nhập hoãn lại có tất cả các phương pháp tương tự như các đối tượng hứa hẹn, tuy nhiên đối tượng hứa hẹn chỉ có phương pháp .done()
, .fail()
và .always()
được sử dụng để thêm callbacks đến đối tượng trì hoãn cho mỗi tương ứng event
. Mặt khác, đối tượng hoãn lại có một số phương thức khác, quan trọng nhất là .resolve()
và .reject()
. Khi các phương thức này được gọi trên đối tượng hoãn lại, tất cả các cuộc gọi lại được gọi. .resolve()
kích hoạt .done()
và .always()
gọi lại trong khi .reject()
phương thức gọi .fail()
và .always()
gọi lại.
Nói chung, đối tượng hoãn lại được giữ trong một phạm vi riêng tư và đối tượng lời hứa được trả về từ hàm để có thể đặt lại các cuộc gọi lại trên nó. Đối tượng bị trì hoãn sẽ được giải quyết sau đó, chẳng hạn như sau khi yêu cầu ajax hoàn thành hoặc sau khi hình ảnh được tải, sau khi setTimeout, v.v. Điều quan trọng là phải nhận ra rằng một đối tượng bị trì hoãn chỉ có thể được giải quyết một lần. Nếu nó đã được giải quyết, các cuộc gọi lại sẽ được gọi ngay lập tức.
Đây là một ví dụ khác, một ví dụ mà tôi sử dụng:
function loadImage(url) {
var def = $.Deferred(),
img = new Image();
$(img).on("load error",function(e){
if (e.type === "error") {
def.reject(url);
}
else {
def.resolve(url);
}
});
img.src = url;
// return the promise object so that callbacks can
// be defined on the deferred object.
return def.promise();
}
loadImage("foobar.jpg").done(function(){
alert("The image is loaded!");
}).fail(function(){
alert("The image failed to load!");
}).always(function(){
alert("This is always called!");
});
Để biết thêm thông tin về $.Deferred()
phương thức của jQuery và các đối tượng bị trì hoãn, hãy truy cập http://api.jquery.com/carget/deferred-object/
Deferred
các đối tượng của jQuery ? Đây có phải là một cái gì đó cụ thể cho Node.js?