Thứ nhất: Bạn không thể sử dụng $.Promise();
vì nó không tồn tại.
Một đối tượng hoãn lại là một đối tượng có thể tạo ra một lời hứa và thay đổi trạng thái của nó đến resolved
hay rejected
. Trì hoãn thường được sử dụng nếu bạn viết hàm của riêng mình và muốn cung cấp lời hứa cho mã gọi. Bạn là nhà sản xuất của các giá trị.
Một lời hứa là, như tên gọi của mình, một lời hứa về giá trị tương lai. Bạn có thể đính kèm các lệnh gọi lại vào nó để nhận giá trị đó. Lời hứa đã được “trao” cho bạn và bạn là người nhận giá trị tương lai.
Bạn không thể sửa đổi trạng thái của lời hứa. Chỉ mã tạo lời hứa mới có thể thay đổi trạng thái của nó.
Ví dụ:
1. ( sản xuất ) Bạn sử dụng các đối tượng trì hoãn khi bạn muốn cung cấp hỗ trợ hứa hẹn cho các chức năng của riêng bạn. Bạn tính toán một giá trị và muốn kiểm soát thời điểm lời hứa được giải quyết.
function callMe() {
var d = new $.Deferred();
setTimeout(function() {
d.resolve('some_value_compute_asynchronously');
}, 1000);
return d.promise();
}
callMe().done(function(value) {
alert(value);
});
2. ( chuyển tiếp ) Nếu bạn đang gọi một hàm mà bản thân nó trả về một lời hứa, thì bạn không cần phải tạo đối tượng hoãn lại của riêng mình. Bạn chỉ có thể trả lại lời hứa đó. Trong trường hợp này, hàm không tạo ra giá trị, nhưng chuyển tiếp nó (loại):
function fetchData() {
return $.ajax({...});
}
fetchData().done(function(response) {
});
3. ( nhận ) Đôi khi bạn không muốn tạo hoặc chuyển các lời hứa / giá trị, bạn muốn sử dụng chúng trực tiếp, tức là bạn là người nhận một số thông tin:
$('#my_element').fadeOut().promise().done(function() {
});
Tất nhiên, tất cả các trường hợp sử dụng này cũng có thể được trộn lẫn. Hàm của bạn có thể là bộ nhận giá trị (từ một lệnh gọi Ajax chẳng hạn) và tính toán (tạo ra) một giá trị khác dựa trên đó.
Câu hỏi liên quan: