已有其他专题本身,但是他们中的大多数都月5年前。 什么是当前、新的方法来取消待呼吁在JS? 即
async myFunc(){
let response = await oneHourLastingFunction();
myProcessData(response);
}
在具体时刻应用决定它不想再等待, oneHourLastingFunction
但这是困在"等待". 怎么要取消? 任何标准的方式取消-tokens/abortControllers 为的承诺?
已有其他专题本身,但是他们中的大多数都月5年前。 什么是当前、新的方法来取消待呼吁在JS? 即
async myFunc(){
let response = await oneHourLastingFunction();
myProcessData(response);
}
在具体时刻应用决定它不想再等待, oneHourLastingFunction
但这是困在"等待". 怎么要取消? 任何标准的方式取消-tokens/abortControllers 为的承诺?
取消一个步骤仍然不是一个简单的任务,特别是当你需要深取消和流量控制。 有没有本地解决方案的时刻。 你所能做本身:
abort
方法的控制,取消所有已订阅微型任务这是相当详细和一个棘手的解决方案的潜在存储器的泄漏。
我可能只是建议我自己解决这个挑战- c-promise2,其中提供了可取消的承诺和可取消的选择,为通信机制详解异功能的发电机。
这是一个基本的实例(现场演示):
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();
深撤销的解决方案(所有功能都是可撤消)(现场演示):
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);