เนื่องจากjQuery 1.8 .then
ทำงานเหมือนกับ.pipe
:
ประกาศการเลิกใช้งาน:ตั้งแต่ jQuery 1.8 deferred.pipe()
วิธีนี้เลิกใช้แล้ว deferred.then()
วิธีการซึ่งแทนที่มันควรจะนำมาใช้แทน
และ
ในฐานะของ jQuery 1.8ที่deferred.then()
วิธีการส่งกลับสัญญาใหม่ที่สามารถกรองสถานะและค่านิยมของรอการตัดบัญชีผ่านฟังก์ชั่นเปลี่ยนตอนนี้เลิกใช้deferred.pipe()
วิธีการ
ตัวอย่างด้านล่างอาจเป็นประโยชน์สำหรับบางคน
พวกเขาตอบสนองวัตถุประสงค์ที่แตกต่างกัน:
.then()
จะถูกใช้เมื่อใดก็ตามที่คุณต้องการทำงานกับผลลัพธ์ของกระบวนการเช่นตามเอกสารระบุเมื่ออ็อบเจ็กต์ที่รอการตัดบัญชีได้รับการแก้ไขหรือปฏิเสธ มันเหมือนกับการใช้.done()
หรือ.fail()
.
คุณจะใช้.pipe()
(ก่อน) กรองผลลัพธ์อย่างใด ค่าที่ส่งคืนของการโทรกลับไป.pipe()
จะถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังdone
และการfail
เรียกกลับ นอกจากนี้ยังสามารถส่งคืนอ็อบเจ็กต์อื่นที่รอการตัดบัญชีและการเรียกกลับต่อไปนี้จะถูกลงทะเบียนในรอการตัดบัญชีนี้
ที่ไม่ได้เป็นกรณีที่มี.then()
(หรือ.done()
, .fail()
) ค่าการกลับมาของการเรียกกลับที่ลงทะเบียนจะถูกละเว้นเพียง
ดังนั้นจะไม่ให้คุณใช้อย่างใดอย่างหนึ่ง หรือ.then()
.pipe()
คุณสามารถใช้.pipe()
เพื่อวัตถุประสงค์เดียวกันกับ.then()
แต่ converse ไม่ถือ
ตัวอย่าง 1
ผลลัพธ์ของการดำเนินการบางอย่างคืออาร์เรย์ของวัตถุ:
[{value: 2}, {value: 4}, {value: 6}]
และคุณต้องการคำนวณค่าต่ำสุดและสูงสุด สมมติว่าเราใช้การdone
เรียกกลับสองครั้ง:
deferred.then(function(result) {
var values = [];
for(var i = 0, len = result.length; i < len; i++) {
values.push(result[i].value);
}
var min = Math.min.apply(Math, values);
}).then(function(result) {
var values = [];
for(var i = 0, len = result.length; i < len; i++) {
values.push(result[i].value);
}
var max = Math.max.apply(Math, values);
});
ในทั้งสองกรณีคุณต้องวนซ้ำรายการและดึงค่าจากแต่ละออบเจ็กต์
จะดีกว่าไหมหากดึงค่าไว้ล่วงหน้าเพื่อที่คุณจะได้ไม่ต้องทำสิ่งนี้ในการเรียกกลับทั้งสองแบบทีละรายการ ใช่ และนั่นคือสิ่งที่เราสามารถใช้.pipe()
สำหรับ:
deferred.pipe(function(result) {
var values = [];
for(var i = 0, len = result.length; i < len; i++) {
values.push(result[i].value);
}
return values;
}).then(function(result) {
var min = Math.min.apply(Math, result);
}).then(function(result) {
var max = Math.max.apply(Math, result);
});
เห็นได้ชัดว่านี่เป็นตัวอย่างที่สร้างขึ้นและมีหลายวิธี (อาจจะดีกว่า) ในการแก้ปัญหานี้ แต่ฉันหวังว่ามันจะอธิบายได้ตรงประเด็น
ตัวอย่าง 2
พิจารณาการโทรของ Ajax บางครั้งคุณต้องการเริ่มต้นการโทร Ajax หนึ่งครั้งหลังจากการโทรครั้งก่อนเสร็จสิ้น วิธีหนึ่งคือการโทรครั้งที่สองภายในการdone
โทรกลับ:
$.ajax(...).done(function() {
$.ajax(...).done(function() {
});
});
ตอนนี้สมมติว่าคุณต้องการแยกรหัสของคุณและวางการโทร Ajax ทั้งสองนี้ไว้ในฟังก์ชัน:
function makeCalls() {
return $.ajax(...).done(function() {
$.ajax(...).done(function() {
});
});
}
คุณต้องการใช้ออบเจ็กต์รอการตัดบัญชีเพื่ออนุญาตรหัสอื่นที่เรียกmakeCalls
ให้แนบการโทรกลับสำหรับการโทร Ajax ครั้งที่สองแต่
makeCalls().done(function() {
});
จะไม่ได้ผลตามที่ต้องการเนื่องจากการโทรครั้งที่สองทำภายในการdone
โทรกลับและไม่สามารถเข้าถึงได้จากภายนอก
วิธีแก้ปัญหาจะใช้.pipe()
แทน:
function makeCalls() {
return $.ajax(...).pipe(function() {
return $.ajax(...).done(function() {
});
});
}
makeCalls().done(function() {
});
โดยใช้.pipe()
ตอนนี้คุณสามารถทำให้มันเป็นไปได้ที่จะผนวกการเรียกกลับไป "ภายใน" โทรอาแจ็กซ์โดยไม่ต้องเปิดเผยที่เกิดขึ้นจริงไหล / สั่งซื้อของสาย
โดยทั่วไปออบเจ็กต์ที่รอการตัดบัญชีเป็นวิธีที่น่าสนใจในการแยกรหัสของคุณ :)