Por fin… Una publicación sobre Por fin en promesas | Programar Plus

“¿Cuándo finally disparar en una promesa de JavaScript? Esta es una pregunta que me hicieron en un taller reciente y pensé en escribir una pequeña publicación para aclarar cualquier confusión.

La respuesta es, para citar a Snape:

Snape diciendo siempre

…siempre.

La estructura básica es así:

try {
  // I’ll try to execute some code for you
}
catch(error) {
  // I’ll handle any errors in that process
} 
finally {
  // I’ll fire either way
}

Tomemos, por ejemplo, este ejemplo de un generador de chistes de Chuck Norris, completo con contenido de la API de la base de datos de Chuck Norris. (Aparte: encontré esta API de la increíble lista de API abiertas de Todd Motto, que es excelente para demostraciones y proyectos paralelos).

ver la pluma
¡por fin! chistes de chuck norris! por Sarah Drasner (@sdras)
en CodePen.

async function getData() {
  try {
    let chuckJokes = await fetch(`https://api.chucknorris.io/jokes/random`)
      .then(res => res.json())
    
    console.log('I got some data for you!')
    document.getElementById("quote").innerHTML = chuckJokes.value;
  } 
  catch(error) {
    console.warn(`We have an error here: ${error}`)
  }
  finally {
    console.log('Finally will fire no matter what!')
  }
}

En la consola:

Consola que dice: ¡Tengo algunos datos para ti!  y ¡Finalmente disparará pase lo que pase!

Ahora, introduzcamos un error tipográfico en la API y accidentalmente coloquemos un montón de erres en la URL de la API. Esto resultará en nuestra try sentencia fallida, lo que significa que el catch ahora arroja un error.

async function getData() {
  try {
    // let's mess this up a bit
    let chuckJokes = await fetch(`https://api.chucknorrrrris.io/jokes/random`)
      .then(res => res.json())
    
    console.log('I got some data for you!')
    document.getElementById("quote").innerHTML = chuckJokes.value;
  } 
  catch(error) {
    console.warn(`We have an error here: ${error}`)
  }
  finally {
    console.log('Finally will fire no matter what!')
  }
}

Consola:

Consola que tiene una solicitud GET fallida y luego una advertencia que dice Tenemos un error aquí, Error de tipo: no se pudo obtener, y luego en una nueva línea, ¡Finalmente se activará sin importar qué!

Una pieza gigante e importante que el ejemplo no ilustra es que el finally cuadra se ejecutará incluso si en el try o catch bloque, un return o break declaración detiene el código.

¿Cuándo usarías esto?

Lo he encontrado particularmente útil en dos situaciones diferentes, aunque estoy seguro de que hay otras:

  • Cuando, de lo contrario, duplicaría el código que se necesita en los bloques de prueba y captura. Aquí hay un ejemplo en una receta del libro de cocina Vue que escribí. Apagué el estado de carga en un finally cuadra. Esto incluye, como en el ejemplo anterior, donde necesito cambiar la interfaz de usuario de alguna manera en cualquier caso.
  • Cuando hay algo de limpieza que hacer. Oracle menciona esto en su documentación. Es Java, pero se aplican las mismas premisas.

Finalmente no es útil tan a menudo como try y catch, pero vale la pena señalarlo para algunos casos de uso. ¡Espero que eso lo aclare!