Las promesas son una forma de lidiar con el código asincrónico en JavaScript, sin escribir demasiadas devoluciones de llamada en su código.
- Introducción a las promesas
- Creando una promesa
- Consumiendo una promesa
- Encadenando promesas
- Manejo de errores
- Orquestando promesas
- Errores comunes
Introducción a las promesas
Una promesa se define comúnmente comoun proxy de un valor que eventualmente estará disponible.
Las promesas son una forma de lidiar con el código asincrónico, sin escribir demasiadas devoluciones de llamada en su código.
Aunque han existido durante años, se estandarizaron y se introdujeron enES2015, y ahora han sido reemplazados enES2017porfunciones asincrónicas.
Funciones asincrónicasuse la API de promesas como su bloque de construcción, por lo que comprenderlas es fundamental incluso si en el código más nuevo probablemente use funciones asíncronas en lugar de promesas.
Cómo funcionan las promesas, en resumen
Una vez que se ha llamado a una promesa, comenzará enestado pendiente. Esto significa que la función de llamada continúa con la ejecución, mientras espera la promesa de hacer su propio procesamiento, y le da a la función de llamada alguna retroalimentación.
En este punto, la función de llamada espera a que devuelva la promesa en unestado resuelto, o en unestado rechazado, perola función continúa su ejecución mientras la promesa lo hace.
¿Qué promesas de uso de JS API?
Además de su propio código y código de biblioteca, las API web modernas estándar utilizan promesas como:
- la API de la batería
- laObtener API
- Trabajadores de servicios
Es poco probable que en JavaScript moderno te encuentresnousando promesas, así que comencemos a sumergirnos en ellas.
Creando una promesa
La API de Promise expone un constructor de Promise, que inicializa usandonew Promise()
:
let done = true
const isItDoneYet = new Promise((resolve, reject) => {
if (done) {
const workDone = ‘Here is the thing I built’
resolve(workDone)
} else {
const why = ‘Still working on something else’
reject(why)
}
})
Como puede ver, la promesa comprueba eldone
variable global, y si eso es cierto, devolvemos una promesa resuelta; de lo contrario, una promesa rechazada.
Usandoresolve
yreject
podemos comunicar un valor, en el caso anterior solo devolvemos una cadena, pero también podría ser un objeto.
Consumiendo una promesa
En la última sección, presentamos cómo se crea una promesa.
Ahora veamos cómo puede ser la promesaconsumadoo usado.
const isItDoneYet = new Promise()
//...
const checkIfItsDone = () => {
isItDoneYet
.then(ok => {
console.log(ok)
})
.catch(err => {
console.error(err)
})
}
CorriendocheckIfItsDone()
ejecutará elisItDoneYet()
promesa y esperará a que se resuelva, utilizando elthen
devolución de llamada, y si hay un error, lo manejará en elcatch
llamar de vuelta.
Encadenando promesas
Una promesa se puede devolver a otra promesa, creando una cadena de promesas.
Un gran ejemplo de encadenamiento de promesas lo da elObtener API, una capa sobre la API XMLHttpRequest, que podemos usar para obtener un recurso y poner en cola una cadena de promesas para ejecutar cuando se recupere el recurso.
La API Fetch es un mecanismo basado en promesas y las llamadasfetch()
es equivalente a definir nuestra propia promesa usandonew Promise()
.
Ejemplo de encadenamiento de promesas
const status = response => {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response)
}
return Promise.reject(new Error(response.statusText))
}
const json = response => response.json()
fetch(’/todos.json’)
.then(status)
.then(json)
.then(data => {
console.log(‘Request succeeded with JSON response’, data)
})
.catch(error => {
console.log(‘Request failed’, error)
})
En este ejemplo, llamamosfetch()
para obtener una lista de elementos TODO de latodos.json
archivo que se encuentra en la raíz del dominio, y creamos una cadena de promesas.
Corriendofetch()
devuelve unrespuesta, que tiene muchas propiedades, y dentro de ellas hacemos referencia:
status
, un valor numérico que representa el código de estado HTTPstatusText
, un mensaje de estado, que esOK
si la solicitud tuvo éxito
response
también tiene unjson()
método, que devuelve una promesa que se resolverá con el contenido del cuerpo procesado y transformado enJSON.
Entonces, dadas esas premisas, esto es lo que sucede: la primera promesa en la cadena es una función que definimos, llamadastatus()
, que verifica el estado de la respuesta y si no es una respuesta exitosa (entre 200 y 299), rechaza la promesa.
Esta operación hará que la cadena de promesas omita todas las promesas encadenadas enumeradas y pasará directamente a lacatch()
declaración en la parte inferior, registrando elRequest failed
texto junto con el mensaje de error.
Si eso tiene éxito en cambio, llama aljson()
función que definimos. Dado que la promesa anterior, cuando tuvo éxito, devolvió elresponse
objeto, lo obtenemos como entrada a la segunda promesa.
En este caso, devolvemos los datos JSON procesados, por lo que la tercera promesa recibe el JSON directamente:
.then((data) => {
console.log('Request succeeded with JSON response', data)
})
y lo registramos en la consola.
Manejo de errores
En el ejemplo anterior, en la sección anterior, teníamos uncatch
que se adjuntó a la cadena de promesas.
Cuando algo en la cadena de promesas falla y genera un error o rechaza la promesa, el control va al más cercano.catch()
declaración en la cadena.
new Promise((resolve, reject) => {
throw new Error('Error')
}).catch(err => {
console.error(err)
})
// or
new Promise((resolve, reject) => {
reject(‘Error’)
}).catch(err => {
console.error(err)
})
Errores en cascada
Si dentro delcatch()
si genera un error, puede agregar un segundocatch()
para manejarlo, y así sucesivamente.
new Promise((resolve, reject) => {
throw new Error('Error')
})
.catch(err => {
throw new Error('Error')
})
.catch(err => {
console.error(err)
})
Orquestando promesas
Promise.all()
Si necesita sincronizar diferentes promesas,Promise.all()
le ayuda a definir una lista de promesas y ejecutar algo cuando estén todas resueltas.
Ejemplo:
const f1 = fetch('/something.json')
const f2 = fetch('/something2.json')
Promise.all([f1, f2])
.then(res => {
console.log(‘Array of results’, res)
})
.catch(err => {
console.error(err)
})
losAsignación de desestructuración ES2015la sintaxis te permite también hacer
Promise.all([f1, f2]).then(([res1, res2]) => {
console.log('Results', res1, res2)
})
No estás limitado a usarfetch
por supuesto,cualquier promesa es buena para ir.
Promise.race()
Promise.race()
se ejecuta tan pronto como una de las promesas que le pasa se resuelve, y ejecuta la devolución de llamada adjunta solo una vez con el resultado de la primera promesa resuelta.
Ejemplo:
const promiseOne = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one')
})
const promiseTwo = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two')
})
Promise.race([promiseOne, promiseTwo]).then(result => {
console.log(result) // ‘two’
})
Errores comunes
Error de tipo no detectado: indefinido no es una promesa
Si obtienes elUncaught TypeError: undefined is not a promise
error en la consola, asegúrese de usarnew Promise()
en lugar de soloPromise()
Descarga mi gratisManual para principiantes de JavaScript
Más tutoriales de js:
- Cosas para evitar en JavaScript (las partes malas)
- Diferidos y promesas en JavaScript (+ ejemplo de Ember.js)
- Cómo subir archivos al servidor usando JavaScript
- Estilo de codificación JavaScript
- Introducción a las matrices de JavaScript
- Introducción al lenguaje de programación JavaScript
- La guía completa de ECMAScript 2015-2019
- Comprender las promesas de JavaScript
- La estructura léxica de JavaScript
- Tipos de JavaScript
- Variables de JavaScript
- Una lista de ejemplos de ideas de aplicaciones web
- Introducción a la programación funcional con JavaScript
- JavaScript asincrónico moderno con Async y Await
- Ámbito y bucles de JavaScript
- La estructura de datos de JavaScript del mapa
- Establecer la estructura de datos de JavaScript
- Una guía para los literales de plantillas de JavaScript
- Hoja de ruta para aprender JavaScript
- Expresiones JavaScript
- Descubra los temporizadores de JavaScript
- Explicación de los eventos de JavaScript
- Bucles de JavaScript
- Escribe bucles de JavaScript usando mapa, filtrar, reducir y buscar
- El bucle de eventos de JavaScript
- Funciones de JavaScript
- El glosario de JavaScript
- Explicación de los cierres de JavaScript
- Un tutorial sobre las funciones de flecha de JavaScript
- Una guía para las expresiones regulares de JavaScript
- Cómo comprobar si una cadena contiene una subcadena en JavaScript
- Cómo eliminar un elemento de una matriz en JavaScript
- Cómo clonar en profundidad un objeto JavaScript
- Introduction to Unicode and UTF-8
- Unicode en JavaScript
- Cómo poner en mayúsculas la primera letra de una cadena en JavaScript
- Cómo formatear un número como valor de moneda en JavaScript
- Cómo convertir una cadena en un número en JavaScript
- esto en JavaScript
- Cómo obtener la marca de tiempo actual en JavaScript
- Modo estricto de JavaScript
- Expresiones de función invocadas inmediatamente (IIFE) de JavaScript
- Cómo redirigir a otra página web usando JavaScript
- Cómo eliminar una propiedad de un objeto JavaScript
- Cómo agregar un elemento a una matriz en JavaScript
- Cómo comprobar si una propiedad de un objeto JavaScript no está definida
- Introducción a los módulos ES
- Introducción a CommonJS
- Programación asincrónica de JavaScript y devoluciones de llamada
- Cómo reemplazar todas las apariciones de una cadena en JavaScript
- Una guía de referencia rápida para la sintaxis de JavaScript moderna
- Cómo recortar el cero a la izquierda en un número en JavaScript
- Cómo inspeccionar un objeto JavaScript
- La guía definitiva para las fechas de JavaScript
- Un tutorial de Moment.js
- Punto y coma en JavaScript
- Los operadores aritméticos de JavaScript
- El objeto matemático de JavaScript
- Genere cadenas únicas y aleatorias en JavaScript
- Cómo hacer que sus funciones de JavaScript duerman
- Herencia de prototipos de JavaScript
- Excepciones de JavaScript
- Cómo utilizar las clases de JavaScript
- El libro de cocina de JavaScript
- Cotizaciones en JavaScript
- Cómo validar una dirección de correo electrónico en JavaScript
- Cómo obtener las propiedades únicas de un conjunto de objetos en una matriz de JavaScript
- Cómo verificar si una cadena comienza con otra en JavaScript
- Cómo crear una cadena de varias líneas en JavaScript
- La guía ES6
- Cómo obtener la URL actual en JavaScript
- La guía ES2016
- Cómo inicializar una nueva matriz con valores en JavaScript
- La guía ES2017
- La guía ES2018
- Cómo usar Async y Await con Array.prototype.map ()
- Async vs código de sincronización
- Cómo generar un número aleatorio entre dos números en JavaScript
- Tutorial de la API de HTML Canvas
- Cómo obtener el índice de una iteración en un bucle for-of en JavaScript
- ¿Qué es una aplicación de página única?
- Una introducción a WebAssembly
- Introducción a JSON
- La guía JSONP
- Should you use or learn jQuery in 2020?
- Cómo ocultar un elemento DOM usando JavaScript simple
- Cómo fusionar dos objetos en JavaScript
- Cómo vaciar una matriz de JavaScript
- Cómo codificar una URL con JavaScript
- Cómo establecer valores de parámetros predeterminados en JavaScript
- Cómo ordenar una matriz de objetos por un valor de propiedad en JavaScript
- Cómo contar el número de propiedades en un objeto JavaScript
- llamar () y aplicar () en JavaScript
- Introducción a PeerJS, la biblioteca WebRTC
- Trabajar con objetos y matrices usando Rest y Spread
- Desestructurar objetos y matrices en JavaScript
- La guía definitiva para depurar JavaScript
- La guía de TypeScript
- Seleccionar dinámicamente un método de un objeto en JavaScript
- Pasar undefined a JavaScript Expresiones de función invocadas inmediatamente
- Idiomas poco tipados vs fuertemente tipados
- Cómo diseñar elementos DOM usando JavaScript
- Transmitir en JavaScript
- Tutorial de generadores de JavaScript
- El tamaño de la carpeta node_modules no es un problema. Es un privilegio
- Cómo resolver el error de identificador inesperado al importar módulos en JavaScript
- Cómo enumerar todos los métodos de un objeto en JavaScript
- El método String replace ()
- El método String search ()
- Cómo ejecuto pequeños fragmentos de JavaScript
- La guía ES2019
- El método String charAt ()
- El método String charCodeAt ()
- El método String codePointAt ()
- El método String concat ()
- El método String endsWith ()
- El método String incluye ()
- El método String indexOf ()
- El método String lastIndexOf ()
- El método String localeCompare ()
- El método String match ()
- El método String normalize ()
- El método String padEnd ()
- El método String padStart ()
- El método String repeat ()
- El método String slice ()
- El método String split ()
- El método String startsWith ()
- El método String substring ()
- El método String toLocaleLowerCase ()
- El método String toLocaleUpperCase ()
- El método String toLowerCase ()
- El método String toString ()
- El método String toUpperCase ()
- El método String trim ()
- El método String trimEnd ()
- El método String trimStart ()
- Memoización en JavaScript
- El método String valueOf ()
- Referencia de JavaScript: cadena
- El método Number isInteger ()
- El método Number isNaN ()
- El método Number isSafeInteger ()
- El método Number parseFloat ()
- El método Number parseInt ()
- El método Number toString ()
- El método Number valueOf ()
- El método Number toPrecision ()
- El método Number toExponential ()
- El método Number toLocaleString ()
- El método Number toFixed ()
- El método Number isFinite ()
- Referencia de JavaScript: Número
- Descriptores de propiedades de JavaScript
- El método de asignación de objetos ()
- El método Object create ()
- El método Object defineProperties ()
- El método Object defineProperty ()
- El método de las entradas de objeto ()
- El método Object freeze ()
- El método Object getOwnPropertyDescriptor ()
- El método Object getOwnPropertyDescriptors ()
- El método Object getOwnPropertyNames ()
- El método Object getOwnPropertySymbols ()
- El método Object getPrototypeOf ()
- El método Object es ()
- El método Object isExtensible ()
- El método Object isFrozen ()
- El método Object isSealed ()
- El método Object keys ()
- El método Object preventExtensions ()
- El método Object seal ()
- El método Object setPrototypeOf ()
- El método Object values ()
- El método Object hasOwnProperty ()
- El método Object isPrototypeOf ()
- El método Object propertyIsEnumerable ()
- El método Object toLocaleString ()
- El método Object toString ()
- El método Object valueOf ()
- Referencia de JavaScript: Objeto
- Operador de asignación de JavaScript
- Internacionalización de JavaScript
- Operador de tipo JavaScript
- Nuevo operador de JavaScript
- Operadores de comparación de JavaScript
- Reglas de precedencia de operadores de JavaScript
- Instancia de JavaScript del operador
- Declaraciones de JavaScript
- Alcance de JavaScript
- Conversiones de tipo JavaScript (transmisión)
- Operadores de igualdad de JavaScript
- El JavaScript if / else condicional
- El cambio condicional de JavaScript
- El operador de eliminación de JavaScript
- Parámetros de función de JavaScript
- El operador de difusión de JavaScript
- Valores de retorno de JavaScript
- Operadores lógicos de JavaScript
- Operador ternario de JavaScript
- Recurrencia de JavaScript
- Propiedades del objeto JavaScript
- Objetos de error de JavaScript
- El objeto global de JavaScript
- La función filter () de JavaScript
- La función map () de JavaScript
- La función reduce () de JavaScript
- El operador JavaScript "in"
- Operadores de JavaScript
- Cómo obtener el valor de una propiedad CSS en JavaScript
- Cómo agregar un detector de eventos a múltiples elementos en JavaScript
- Campos de clase privada de JavaScript
- Cómo ordenar una matriz por valor de fecha en JavaScript
- Campos de clase pública de JavaScript
- Símbolos JavaScript
- Cómo utilizar la biblioteca bcrypt de JavaScript
- Cómo cambiar el nombre de los campos cuando se usa la desestructuración de objetos
- Cómo verificar tipos en JavaScript sin usar TypeScript
- Cómo comprobar si una matriz de JavaScript contiene un valor específico
- ¡¡Qué hace el operador de doble negación !! hacer en JavaScript?
- ¿Qué operador de igualdad debería usarse en las comparaciones de JavaScript? == vs ===
- ¿Vale la pena aprender JavaScript?
- Cómo devolver el resultado de una función asincrónica en JavaScript
- Cómo comprobar si un objeto está vacío en JavaScript
- Cómo salir de un bucle for en JavaScript
- Cómo agregar un elemento a una matriz en un índice específico en JavaScript
- Por qué no debería modificar un prototipo de objeto JavaScript
- ¿Cuál es la diferencia entre usar let y var en JavaScript?
- Enlaces utilizados para activar funciones de JavaScript
- Cómo unir dos cadenas en JavaScript
- Cómo unir dos matrices en JavaScript
- ¿Cómo comprobar si un valor de JavaScript es una matriz?
- ¿Cómo obtener el último elemento de una matriz en JavaScript?
- Cómo enviar datos codificados en URL usando Axios
- Cómo obtener la fecha de mañana usando JavaScript
- Cómo obtener la fecha de ayer usando JavaScript
- Cómo obtener el nombre del mes a partir de una fecha de JavaScript
- Cómo comprobar si dos fechas son el mismo día en JavaScript
- Cómo verificar si una fecha se refiere a un día en el pasado en JavaScript
- Declaraciones etiquetadas JavaScript
- Cómo esperar a que se resuelvan 2 o más promesas en JavaScript
- Cómo obtener los días entre 2 fechas en JavaScript
- Cómo cargar un archivo usando Fetch
- Cómo formatear una fecha en JavaScript
- Cómo iterar sobre las propiedades del objeto en JavaScript
- Cómo calcular el número de días entre 2 fechas en JavaScript
- Cómo utilizar la espera de nivel superior en los módulos ES
- Importaciones dinámicas de JavaScript
- Encadenamiento opcional de JavaScript
- Cómo reemplazar el espacio en blanco dentro de una cadena en JavaScript
- Coalescencia nula de JavaScript
- Cómo aplanar una matriz en JavaScript
- Esta década en JavaScript
- Cómo enviar el encabezado de autorización usando Axios
- Lista de palabras clave y palabras reservadas en JavaScript
- Cómo convertir una matriz en una cadena en JavaScript
- Cómo eliminar todo el contenido de las carpetas node_modules
- Cómo eliminar duplicados de una matriz de JavaScript
- Let vs Const en JavaScript
- La misma llamada a la API POST en varias bibliotecas de JavaScript
- Cómo obtener los primeros n elementos en una matriz en JS
- Cómo dividir una matriz en varias partes iguales en JS
- Cómo ralentizar un bucle en JavaScript
- Cómo cargar una imagen en un lienzo HTML
- Cómo cortar una cadena en palabras en JavaScript
- Cómo dividir una matriz por la mitad en JavaScript
- Cómo escribir texto en un lienzo HTML
- Cómo eliminar el último carácter de una cadena en JavaScript
- Cómo eliminar el primer carácter de una cadena en JavaScript
- Cómo corregir el TypeError: no se puede asignar a la propiedad de solo lectura 'exportaciones' del objeto '# & lt; Object & gt;' error
- Cómo crear una ventana emergente de intención de salida
- Cómo comprobar si un elemento es descendiente de otro
- Cómo forzar las credenciales a cada solicitud de Axios
- Cómo resolver el error "no es una función" en JavaScript
- Gatsby, como cambiar el favicon
- Cargando un archivo JS externo usando Gatsby
- Cómo detectar el modo oscuro usando JavaScript
- Parcela, cómo solucionar el error `regeneratorRuntime is not defined`
- Cómo detectar si se está utilizando un bloqueador de anuncios con JavaScript
- Desestructuración de objetos con tipos en TypeScript
- El manual de Deno: una breve introducción a Deno 🦕
- Cómo obtener el último segmento de una ruta o URL usando JavaScript
- Cómo mezclar elementos en una matriz de JavaScript
- Cómo comprobar si existe una clave en un objeto JavaScript
- Generación de eventos y captura de eventos
- event.stopPropagation vs event.preventDefault () vs return false en eventos DOM
- Tipos primitivos vs objetos en JavaScript
- ¿Cómo puede saber qué tipo de valor es en JavaScript?
- Cómo devolver varios valores de una función en JavaScript
- Funciones de flecha frente a funciones regulares en JavaScript
- ¿De qué formas podemos acceder al valor de una propiedad de un objeto?
- ¿Cuál es la diferencia entre nulo e indefinido en JavaScript?
- ¿Cuál es la diferencia entre un método y una función?
- ¿Cuáles son las formas en que podemos salir de un bucle en JavaScript?
- El JavaScript for..of loop
- ¿Qué es la desestructuración de objetos en JavaScript?
- ¿Qué es izar en JavaScript?
- Cómo convertir las comas en puntos con JavaScript
- La importancia de la sincronización al trabajar con DOM
- Cómo invertir una matriz de JavaScript
- Cómo comprobar si un valor es un número en JavaScript
- Cómo aceptar parámetros ilimitados en una función de JavaScript
- Objetos de proxy de JavaScript
- Delegación de eventos en el navegador usando JavaScript vanilla
- La súper palabra clave de JavaScript
- Introducción a XState
- ¿Los valores se pasan por referencia o por valor en JavaScript?
- Eventos personalizados en JavaScript
- Errores personalizados en JavaScript
- Espacios de nombres en JavaScript
- Un curioso uso de las comas en JavaScript
- Encadenamiento de llamadas a métodos en JavaScript
- Cómo manejar el rechazo de promesas
- Cómo intercambiar dos elementos de matriz en JavaScript
- Cómo solucioné un error "cb.apply no es una función" mientras usaba Gitbook
- Cómo agregar un elemento al comienzo de una matriz en JavaScript
- Gatsby, corrige el error "no se puede encontrar el módulo gatsby-cli / lib / reporter"
- Cómo obtener el índice de un elemento en una matriz de JavaScript
- Cómo probar un objeto vacío en JavaScript
- Cómo desestructurar un objeto a variables existentes en JavaScript
- La estructura de datos de JavaScript Array
- La estructura de datos de JavaScript de pila
- Estructuras de datos de JavaScript: cola
- Estructuras de datos de JavaScript: Establecer
- Estructuras de datos JavaScript: diccionarios
- Estructuras de datos de JavaScript: listas vinculadas
- JavaScript, como exportar una función
- JavaScript, cómo exportar múltiples funciones
- JavaScript, como salir de una función
- JavaScript, cómo encontrar un carácter en una cadena
- JavaScript, cómo filtrar una matriz
- JavaScript, como extender una clase
- JavaScript, como encontrar duplicados en una matriz
- JavaScript, cómo reemplazar un elemento de una matriz
- Algoritmos JavaScript: búsqueda lineal
- Algoritmos JavaScript: búsqueda binaria
- Algoritmos de JavaScript: Orden de selección
- Algoritmos JavaScript: Quicksort
- Algoritmos de JavaScript: combinación de ordenación
- Algoritmos JavaScript: Clasificación de burbujas