Con la espera de nivel superior aceptada en ES2022, me pregunto si es seguro asumir que await import("./path/to/module") no tiene ningún tiempo de espera. Esto es lo que me gustaría hacer:
// 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"); Y esto es lo que espero ver al ejecutar el node src/commands/do-everything.mjs :
Doing a... Done. Doing b... Done.No pude encontrar ninguna mención del tiempo de espera de espera de nivel superior, pero me pregunto si lo que estoy tratando de hacer es un mal uso de la función. En teoría, Node.js (o Deno) podría generar una excepción después de alcanzar un límite de tiempo predefinido (por ejemplo, 30 segundos).
Así es como me he estado acercando a la misma tarea antes de TLA:
// src/commands/do-a.cjs 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.cjs 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.cjs 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() ejecuta la función si __filename coincide con require.main?.filename .
Hasta donde yo sé, no hay tiempo de espera por defecto en async-await. Existe el paquete await-timeout, por ejemplo, que agrega un comportamiento de tiempo de espera. Ejemplo:
import Timeout from 'await-timeout'; const timer = new Timeout(); try { await Promise.race([ fetch('https://example.com'), timer.set(1000, 'Timeout!') ]); } finally { timer.clear(); }Tomado de los documentos: https://www.npmjs.com/package/await-timeout
Como puede ver, se crea una instancia de Timeout y su método set define el tiempo de espera y el mensaje de tiempo de espera.
Respuesta: No, no hay un tiempo de espera de nivel superior en una espera.
Esta función en realidad se está utilizando en Deno para un servidor web, por ejemplo:
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");En este ejemplo, "A" se imprime en la consola y "B" no hasta que se apaga el servidor web (lo que no sucede automáticamente).