ไม่เรายังทำไม่ได้
ES6 สัญญาไม่สนับสนุนการยกเลิกเลย มันกำลังมาถึงและการออกแบบเป็นสิ่งที่หลายคนทำงานอย่างหนัก ความหมายของการยกเลิกเสียงทำได้ยากและอยู่ระหว่างดำเนินการ มีการถกเถียงที่น่าสนใจเกี่ยวกับ repo "fetch", esdiscuss และ repos อื่น ๆ อีกมากมายใน GH แต่ฉันจะอดทนถ้าฉันเป็นคุณ
แต่ แต่ แต่ .. การยกเลิกนั้นสำคัญมาก!
มันคือความเป็นจริงของเรื่องก็คือการยกเลิกเป็นจริงสถานการณ์ที่สำคัญในการเขียนโปรแกรมฝั่งไคลเอ็นต์ กรณีที่คุณอธิบายเช่นการยกเลิกคำขอเว็บมีความสำคัญและมีอยู่ทุกที่
ดังนั้น ... ภาษาทำให้ฉันเมา!
ใช่ขอโทษเกี่ยวกับเรื่องนั้น สัญญาจะต้องเข้ามาก่อนก่อนที่จะมีการระบุสิ่งต่างๆเพิ่มเติมดังนั้นพวกเขาจึงเข้าไปโดยไม่มีสิ่งที่เป็นประโยชน์เช่น.finally
และ.cancel
- มันกำลังมาถึงข้อกำหนดผ่าน DOM การยกเลิกไม่ใช่การคิดในภายหลัง แต่เป็นเพียงข้อ จำกัด ด้านเวลาและแนวทางการออกแบบ API ซ้ำ ๆ
แล้วฉันจะทำอย่างไร?
คุณมีทางเลือกหลายทาง:
- ใช้ไลบรารีของบุคคลที่สามเช่นbluebirdซึ่งสามารถเคลื่อนที่ได้เร็วกว่า spec มากจึงมีการยกเลิกรวมถึงสินค้าอื่น ๆ อีกมากมายนี่คือสิ่งที่ บริษัท ขนาดใหญ่เช่น WhatsApp ทำ
- ผ่านการยกเลิกโทเค็น
การใช้ไลบรารีของบุคคลที่สามนั้นค่อนข้างชัดเจน สำหรับโทเค็นคุณสามารถทำให้เมธอดของคุณใช้ฟังก์ชันแล้วเรียกใช้งานดังต่อไปนี้:
function getWithCancel(url, token) {
var xhr = new XMLHttpRequest;
xhr.open("GET", url);
return new Promise(function(resolve, reject) {
xhr.onload = function() { resolve(xhr.responseText); });
token.cancel = function() {
xhr.abort();
reject(new Error("Cancelled"));
};
xhr.onerror = reject;
});
};
ซึ่งจะช่วยให้คุณทำ:
var token = {};
var promise = getWithCancel("/someUrl", token);
token.cancel();
กรณีการใช้งานจริงของคุณ - last
สิ่งนี้ไม่ยากเกินไปสำหรับวิธีการโทเค็น:
function last(fn) {
var lastToken = { cancel: function(){} };
return function() {
lastToken.cancel();
var args = Array.prototype.slice.call(arguments);
args.push(lastToken);
return fn.apply(this, args);
};
}
ซึ่งจะช่วยให้คุณทำ:
var synced = last(getWithCancel);
synced("/url1?q=a");
synced("/url1?q=ab");
synced("/url1?q=abc");
synced("/url1?q=abcd").then(function() {
});
และไม่ไลบรารีอย่าง Bacon และ Rx จะไม่ "ส่องแสง" ที่นี่เพราะเป็นไลบรารีที่สังเกตได้พวกเขาก็มีไลบรารีสัญญาระดับผู้ใช้ที่ได้เปรียบเหมือนกันโดยไม่ถูก จำกัด เฉพาะ ฉันเดาว่าเราจะรอและดูใน ES2016 เมื่อสิ่งที่สังเกตได้เป็นของพื้นเมือง พวกเขาเป็นที่ดีสำหรับ typeahead แม้ว่า