ที่เหมาะสมทางที่จะยกเลิก(หยุด)กำลัง async/รอฟังก์ชัน?

0

คำถาม

มันต้องมีคนอยู่บนหัวข้อคุ SE แต่พวกเขาส่วนใหญ่เป็นเคยเดทกับ 5 ปีที่แล้ว อะไรคือปัจจุบันขึ้นไป-ไป-เดวิธีที่จะยกเลิกรอคำสั่งเรียกใน JS? i.e.

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

ที่เจาะจงช่วงเวลาโปรแกรมตัดสินใจมันไม่ต้องรอก่อน oneHourLastingFunctionแต่มันติดอยู่"ร". ยังไงเพื่อยกเลิกมัน? มีมาตรฐานทางของ cancelation-สัญลักษณ์/abortControllers เพื่อคำสัญญาหรอ?

1

คำตอบที่ดีที่สุด

1

ยกเลิกการ 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);
2021-11-25 16:48:29

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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