适当的方式中止(停止)运行异/等待功能吗?

0

的问题

已有其他专题本身,但是他们中的大多数都月5年前。 什么是当前、新的方法来取消待呼吁在JS? 即

async myFunc(){
    let response = await oneHourLastingFunction();
    myProcessData(response);
}

在具体时刻应用决定它不想再等待, oneHourLastingFunction但这是困在"等待". 怎么要取消? 任何标准的方式取消-tokens/abortControllers 为的承诺?

1

最好的答案

1

取消一个步骤仍然不是一个简单的任务,特别是当你需要深取消和流量控制。 有没有本地解决方案的时刻。 你所能做本身:

  • 通AbortController实例向每个嵌套异功能你想撤销的
  • 订阅所有内部的微任务(请求、计时器、等等)的信号
  • 选择地取消订阅已完成的微任务的信号
  • 呼叫 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);
2021-11-25 16:48:29

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................