วิธีการทำงานของการโทรกลับแบบเลื่อนเวลาคือทุกครั้งที่คุณเพิ่มการโทรกลับการโทรกลับนั้นจะถูกส่งไปยังอาร์เรย์ จากนั้นเมื่อ.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 หรือไม่?