Estoy escribiendo una herramienta de línea de comandos en TypeScript. En un momento, necesita detectar, sincrónicamente , sin importar el retraso, si un archivo en el disco es un archivo de audio. Estoy usando MediaInfo.js para esto, y su API es, comprensiblemente, asincrónica, ya que los archivos multimedia pueden ser enormes. Mi objetivo es crear una función síncrona isAudioFile(...) que invocará la API asíncrona de MediaInfo.js, pero de alguna manera esperará una respuesta y devolverá true o false sin convertirse en una función asíncrona.
Intenté simplemente hacer que todo sea asíncrono, pero luego recibo errores de una parte de la cadena de herramientas sobre las funciones de nivel superior que no pueden ser asíncronas. Estoy atascado en las versiones de Node (14.15.1) y TypeScript (4.5.4) que estoy usando por razones poco interesantes. Empecé a sentir que la asincronía en JS/TS es una especie de virus; parece que es solo async/await todo el camino hacia abajo.
Le pregunté a varios desarrolladores de JS en los que confío y respeto, y me dijeron que esto "simplemente no es posible" y que "lo estoy pensando de manera incorrecta", pero nadie ha podido decírmelo todavía. cómo debería estar pensando en ello, o cómo resolver el problema al que me enfrento.
Seguramente debe haber algún equivalente a una variable de condición en la que pueda esperar, incluso en un tiempo de ejecución multitarea cooperativo de un solo subproceso como Node.js. Encontré JSZip-sync que parece lograr algo similar, aunque con una complejidad significativa. ¿ Realmente no hay una manera simple de lograr esta tarea aparentemente más sencilla?
¿Realmente no hay una manera simple de lograr esta tarea aparentemente más sencilla?
Sí, realmente no lo hay.
Su idea de "variable de condición" no funciona en un tiempo de ejecución de subproceso único: si su subproceso único bloquea la variable, no se puede ejecutar ningún otro código que pueda cambiar el valor de la variable.
Hay algunas formas complicadas de lograr esto (por ejemplo, ejecutar un subproceso con spawnSync ), pero no son buenas.
Me han dicho que esto "simplemente no es posible" y que estoy "pensando en ello de manera incorrecta", pero nadie ha sido capaz de decirme cómo debería pensar en ello o cómo resolver el problema. problema que estoy enfrentando.
Debes pensar en el problema de forma asíncrona. La interacción con el sistema de archivos es asíncrona, ¡se necesita tiempo para acceder a esos discos de óxido giratorio!
Sí, la asincronía es "infecciosa", porque si una parte de su función es asíncrona (y necesita pensar en otro código arbitrario que se ejecuta mientras tanto), toda la función lo es. Sin embargo, eso no significa que deba extenderse a su lógica comercial .
" Recibo errores de alguna parte de la cadena de herramientas sobre funciones de nivel superior que no pueden ser asíncronas " suena como un problema solucionable.