Есть ли тайм-аут у await верхнего уровня?

Поскольку ожидание верхнего уровня принято в ES2022, мне интересно, можно ли предположить, что await import("./path/to/module")вообще не имеет тайм-аута. Вот что я хотел бы сделать:

      // src/commands/do-a.mjs

console.log("Doing a...");
await doSomethingThatTakesHours();
console.log("Done.");
      // src/commands/do-b.mjs

console.log("Doing b...");
await doSomethingElseThatTakesDays();
console.log("Done.");
      // src/commands/do-everything.mjs

await import("./do-a");
await import("./do-b");

И вот что я ожидаю увидеть при беге node src/commands/do-everything.mjs:

      Doing a...
Done.
Doing b...
Done.

Я не смог найти никаких упоминаний о тайм-ауте ожидания верхнего уровня, но мне интересно, не является ли то, что я пытаюсь сделать, неправильным использованием этой функции. Теоретически Node.js (или Deno) может вызвать исключение после достижения некоторого предопределенного временного ограничения (скажем, 30 секунд).

Вот как я подходил к той же задаче до TLA:

      // src/commands/do-a.mjs
import { autoStartCommandIfNeeded } from "@kachkaev/commands";

const doA = async () => {
  console.log("Doing a...");
  await doSomethingThatTakesHours();
  console.log("Done.");
}

export default doA;

autoStartCommandIfNeeded(doA, __filename);
      // src/commands/do-b.mjs
import { autoStartCommandIfNeeded } from "@kachkaev/commands";

const doB = async () => {
  console.log("Doing b...");
  await doSomethingThatTakesDays();
  console.log("Done.");
}

export default doB;

autoStartCommandIfNeeded(doB, __filename);
      // src/commands/do-everything.mjs
import { autoStartCommandIfNeeded } from "@kachkaev/commands";
import doA from "./do-a";
import doB from "./do-b";

const doEverything = () => {
  await doA();
  await doB();
}

export default doEverything;

autoStartCommandIfNeeded(doEverything, __filename);

autoStartCommandIfNeeded() выполняет функцию, если __filename Спички require.main?.filename.

2 ответа

Насколько я знаю, в async-await по умолчанию нет тайм-аута. Например, есть пакет await-timeout, который добавляет поведение тайм-аута. Пример:

      import Timeout from 'await-timeout';
 
const timer = new Timeout();
try {
  await Promise.race([
    fetch('https://example.com'),
    timer.set(1000, 'Timeout!')
  ]);
} finally {
  timer.clear();
}

Взято из документов: https://www.npmjs.com/package/await-timeout

Как видите, Timeout создается и его set определяет тайм-аут и сообщение о тайм-ауте.

Ответ: Нет, для ожидания нет тайм-аута верхнего уровня.

Эта функция фактически используется в Deno для веб-сервера, например:

      import { serve } from "https://deno.land/std@0.103.0/http/server.ts";

const server = serve({ port: 8080 });
console.log(`HTTP webserver running.  Access it at:  http://localhost:8080/`);

console.log("A");

for await (const request of server) {
  let bodyContent = "Your user-agent is:\n\n";
  bodyContent += request.headers.get("user-agent") || "Unknown";

  request.respond({ status: 200, body: bodyContent });
}

console.log("B");

В этом примере «A» печатается в консоли, а «B» - нет, пока веб-сервер не будет выключен (что не происходит автоматически).

Другие вопросы по тегам