เนื่องจาก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()ตอนนี้คุณสามารถทำให้มันเป็นไปได้ที่จะผนวกการเรียกกลับไป "ภายใน" โทรอาแจ็กซ์โดยไม่ต้องเปิดเผยที่เกิดขึ้นจริงไหล / สั่งซื้อของสาย
โดยทั่วไปออบเจ็กต์ที่รอการตัดบัญชีเป็นวิธีที่น่าสนใจในการแยกรหัสของคุณ :)