Node.js programación síncrona vs asíncrona – Parte 2

Generalmente los lenguajes de programación se ejecutan de manera secuencial:

  1. Abrir archivo
  2. Leer archivo
  3. Cerrar archivo

Lectura de archivo con Node.js de manera sincrona:

const fs = require('fs')
let content
try {
 content = fs.readFileSync('archivo.txt', 'utf-8')
} catch (ex) {
 console.log(ex)
}
console.log(content)

El principal problema son las funciones bloqueantes, ya que podrían estar ejecutándose otras peticiones u operaciones, y dejar esto en espera hasta que se lea el archivo y así optimizar para que la CPU esté a pleno rendimiento y los procesos bloqueantes queden a la espera.

Programación asincrona en Node.js

Para poder entender las funciones asíncronas, hay que introducir el concepto de callback.

const numbers = [2,4,1,5,4]

function esMayorQueDos (num) {  
  return num > 2
}

numbers.filter(esMayorQueDos)

En el ejemplo se observa cómo le pasamos a la función de filtro, cómo parámetro otra función, de tal manera que cuando esta termina es devuelta con la solución.

Cosas a tener en cuenta:

  • El manejo de errores: dentro de un try-catch, tienes que hacer la comprobación de los errores en esta callback
  • No se devuelven valores: en una función asíncrona, no se devuelven valores, pero los valores serán pasados al callback

Con el siguiente ejemplo lo entenderemos un poco mejor que se ejecuta antes y qué después:

const fs = require('fs')

console.log('Empezamos a leer el archivo...')

fs.readFile('archivo.malo', 'utf-8', function (err, content) {  
  if (err) {
    console.log('error al leer el archivo')
    return console.log(err)
  }

  console.log(content)
})

console.log('fin del archivo')

La salida de este script será algo parecido a:

Empezamos a leer el archivo...
fin del archivo
error al leer el archivo

Promesas

El objeto promesa se usa para cálculos diferido. Una promesa representa una operación que todavía no se ha completado, pero que se espera en el futuro.

Veamos un ejemplo:

function stats (file) {  
  return new Promise((resolve, reject) => {
    fs.stat(file, (err, data) => {
      if (err) {
        return reject (err)
      }
      resolve(data)
    })
  })
}

Promise.all([  
  stats('file1'),
  stats('file2'),
  stats('file3')
])
.then((data) => console.log(data))
.catch((err) => console.log(err))

Seguir leyendo:

Node.js Tu primer servidor – Parte 3

carlospf

Ingeniero Técnico en Informática de Sistemas, especializado en desarrollo de soluciones software y comercio electrónico. Director técnico y cofundador de CoverManager, software de gestión de reservas en restaurantes de alta ocupación.

También te podría gustar...

Deja un comentario