Aprendiendo a usar la función race() en JavaScript
Mejore su programación asíncrona con race()
La función race() es una herramienta útil en JavaScript para manejar tareas asíncronas que pueden completarse de manera simultánea. Permite a los desarrolladores ejecutar varias promesas o operaciones asincronas al mismo tiempo y obtener el resultado más rápido de ellas. En este artículo, explicaremos cómo usar race() en sus proyectos y cómo puede mejorar su programación asíncrona.
Ejemplo 1: Obtener la versión de Node.js
const { exec } = require('child_process');
exec('node -v', (error, stdout) => {
if (error) {
console.log(`Error: ${error}`);
return;
}
const version = stdout.trim();
console.log(`La versión de Node.js es: ${version}`);
});
Ejemplo 2: Obtener la fecha actual
const { race } = require('node:timers');
race([
() => {
const now = new Date();
console.log(`La fecha actual es: ${now.toLocaleDateString()}`);
},
() => console.log('Tarea asincrona completada.')
]);
Ejemplo 3: Esperar a que un usuario presione una tecla
const { race } = require('node:timers');
race([
() => new Promise((resolve) => process.stdin.on('data', resolve)),
() => console.log('El usuario no presionó ninguna tecla.')
]);
Ejemplo 4: Esperar a que un archivo sea escrito y luego leerlo
const { writeFile, readFile } = require('fs/promises');
const { race } = require('node:timers');
async function escribirLeerArchivo() {
const contenido = 'Esto es un archivo de prueba.';
const rutaArchivo = '/ruta/al/archivo.txt';
await race([
() => writeFile(rutaArchivo, contenido),
() => console.log('Error al escribir el archivo.')
]);
try {
const textoDelArchivo = await readFile(rutaArchivo, 'utf-8');
console.log(`El contenido del archivo es: ${textoDelArchivo}`);
} catch (error) {
console.error(`Error al leer el archivo: ${error.message}`);
}
}
escribirLeerArchivo();
Ejemplo 5: Esperar a que un servidor HTTP escuche en un puerto
const { race } = require('node:timers');
const http = require('http');
function iniciarServidor() {
const servidor = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hola desde el servidor.');
});
return new Promise((resolve) => {
const puerto = 3000;
servidor.listen(puerto, resolve);
});
}
async function esperarALaEscucha() {
try {
await race([
() => iniciarServidor(),
() => console.log('Error al iniciar el servidor.')
]);
console.log('El servidor está escuchando en el puerto 3000.');
} catch (error) {
console.error(`Error: ${error.message}`);
}
}
esperarALaEscucha();
Ejemplo 6: Esperar a que un usuario ingrese dos números y luego calcular su suma
const { race } = require('node:timers');
function leerNumero() {
return new Promise((resolve) => {
process.stdin.on('data', (numero) => {
resolve(Number(numero));
});
});
}
async function sumarNumeros() {
try {
await race([
() => leerNumero().then((num1) => leerNumero().then((num2) => num1 + num2)),
() => console.log('El usuario no ingresó ningún número.')
]);
console.log(`La suma es: ${suma}`);
} catch (error) {
console.error(`Error: ${error.message}`);
}
}
sumarNumeros();
Conclusión
En resumen, la función race() es una herramienta valiosa para manejar tareas asíncronas en JavaScript. Permite a los desarrolladores ejecutar varias promesas o operaciones asincronas al mismo tiempo y obtener el resultado más rápido de ellas. Al integrar race() en sus proyectos, los desarrolladores pueden mejorar la eficiencia y rendimiento de su código, lo que puede ser especialmente útil en aplicaciones con una gran cantidad de tareas asíncronas.