Есть ли тайм-аут у 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» - нет, пока веб-сервер не будет выключен (что не происходит автоматически).