วิธีการทำงานของการโทรกลับแบบเลื่อนเวลาคือทุกครั้งที่คุณเพิ่มการโทรกลับการโทรกลับนั้นจะถูกส่งไปยังอาร์เรย์ จากนั้นเมื่อ.resolve()
หรือ.resolveWith()
วิธีการที่เรียกว่าบนวัตถุรอการตัดบัญชีทั้งหมด.done()
เรียกกลับในอาร์เรย์จะดำเนินการตามลำดับ
ตอนนี้เราสามารถดูว่า Deferred Object คืออะไร นำตัวอย่างข้อมูลด้านล่างเป็นตัวอย่าง
var deferred = $.Deferred();
var promise = deferred.promise();
สิ่งที่เรามีตอนนี้คือวัตถุรอการตัดบัญชีและวัตถุสัญญาของวัตถุรอการตัดบัญชี วัตถุรอตัดบัญชีมีทุกวิธีการเช่นเดียวกับวัตถุสัญญา แต่วัตถุสัญญาเพียง แต่มีวิธีการ.done()
, .fail()
และที่ใช้ในการเพิ่มการเรียกกลับไปยังวัตถุที่รอการตัดบัญชีสำหรับแต่ละที่เกี่ยวข้อง.always()
event
วัตถุรอการตัดบัญชีในมืออื่น ๆ มีวิธีการอื่น ๆ อีกหลายที่สำคัญที่สุดและ.resolve()
.reject()
เมื่อวิธีการเหล่านี้ถูกเรียกบนวัตถุรอการตัดบัญชีการเรียกกลับทั้งหมดจะถูกเรียก .resolve()
fires .done()
และ.always()
callbacks ขณะที่.reject()
เมธอด call .fail()
และ.always()
callbacks
โดยทั่วไปแล้ววัตถุรอการตัดบัญชีจะถูกซ่อนไว้ภายในขอบเขตส่วนตัวและวัตถุสัญญาจะถูกส่งกลับจากฟังก์ชั่นเพื่อให้สามารถวางกลับได้ วัตถุที่เลื่อนออกไปจะได้รับการแก้ไขในภายหลังเช่นหลังจากคำขอ ajax เสร็จสมบูรณ์หรือหลังจากโหลดรูปภาพแล้วหลังจาก setTimeout เป็นต้นสิ่งสำคัญคือต้องตระหนักว่าวัตถุที่เลื่อนออกไปจะสามารถแก้ไขได้เพียงครั้งเดียว หากได้รับการแก้ไขแล้วจะมีการโทรกลับโดยทันที
นี่เป็นอีกตัวอย่างหนึ่งที่ฉันใช้:
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!");
});
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ$.Deferred()
วิธีการของ jQuery และวัตถุที่ถูกเลื่อนเวลาไปที่http://api.jquery.com/category/deferred-object/
Deferred
วัตถุของ jQuery หรือไม่? สิ่งนี้เกี่ยวกับ Node.js หรือไม่?