ยกเลิกการ asynchronous ขั้นตอนยังไม่ใช่เรื่องที่งานโดยเฉพาะอย่างยิ่งเมื่อคุณต้องการลึกเข้าไปโดนยกเลิกเรื่อยๆและมารวมกันของเลือการควบคุม มันไม่เป็นชนพื้นเมืองที่ทางออกในตอนนี้ ทั้งหมดที่คุณทำได้ natively:
- ผ่าน AbortController ตัวอย่างไปกันรอบการ async ฟังก์ชันคุณต้องการที่จะทำให้ cancellable
- บอกรับทุกภายในโคร-งาน(ร้องขอ,ซิ,etc)ต้องสัญญาณ
- optionally รยกเลิกการบอกรับข่าวเสร็จสมบูรณ์โคร-งานจากสัญญาณ
- โทรหา
abort
วิธีการของ controller ต้องยกเลิกทุกบอกรับโคร-งาน
นี่มันค่อนข้าง verbose และยุ่งยาแก้ปัญหากับศักยภาพความทรงจำรูรั่วคุณซ่อมมันได้ไหม?
ฉันแค่แนะนำของตัวเองทางออกที่ท้าทาย- c-promise2,ซึ่ง cancelable สัญญาและ cancelable ทางเลือกสำหรับ ECMA asynchronous ฟังก์ชัน-ดมาเครื่อง.
นี่เป็นพื้นฐานตัวอย่างเช่น(อยู่ทำเทปต่อดีกว่า):
import { CPromise } from "c-promise2";
// deeply cancelable generator-based asynchronous function
const oneHourLastingFunction = CPromise.promisify(function* () {
// optionally just for logging
this.onCancel(() =>
console.log("oneHourLastingFunction::Cancel signal received")
);
yield CPromise.delay(5000); // this task will be cancelled on external timeout
return "myData";
});
async function nativeAsyncFn() {
await CPromise.delay(5000);
}
async function myFunc() {
let response;
try {
response = await oneHourLastingFunction().timeout(2000);
} catch (err) {
if (!CPromise.isCanceledError(err)) throw err;
console.warn("oneHourLastingFunction::timeout", err.code); // 'E_REASON_TIMEOUT'
}
await nativeAsyncFn(response);
}
const nativePromise = myFunc();
ลึกๆ cancellable ทางออก(ทุกฟังก์ชันเป็น cancellable)(อยู่ทำเทปต่อดีกว่า):
import { CPromise } from "c-promise2";
// deeply cancelable generator-based asynchronous function
const oneHourLastingFunction = CPromise.promisify(function* () {
yield CPromise.delay(5000);
return "myData";
});
const otherAsyncFn = CPromise.promisify(function* () {
yield CPromise.delay(5000);
});
const myFunc = CPromise.promisify(function* () {
let response;
try {
response = yield oneHourLastingFunction().timeout(2000);
} catch (err) {
if (err.code !== "E_REASON_TIMEOUT") throw err;
console.log("oneHourLastingFunction::timeout");
}
yield otherAsyncFn(response);
});
const cancellablePromise = myFunc().then(
(result) => console.log(`Done: ${result}`),
(err) => console.warn(`Failed: ${err}`)
);
setTimeout(() => {
console.log("send external cancel signal");
cancellablePromise.cancel();
}, 4000);