¿Cuáles son algunos consejos, trucos y errores al usar promesas de JavaScript?

Las promesas de JS son un poco difíciles de trabajar y requieren pruebas cuidadosas:

Primero, no estás haciendo programación multiproceso, así que no puedes pensar de esa manera.

En segundo lugar, si se olvida, incluso por un segundo, de encadenar sus promesas, las cosas se romperán, a veces de formas poco obvias.

Tercero, escribir pruebas que involucren promesas puede ser difícil, y puede terminar con pruebas que parecen pasar a pesar de que las promesas arrojaron excepciones, porque esas excepciones se lanzaron después de que se completara la prueba.

Las promesas son pequeñas y complicadas y usted necesita pasar un poco de tiempo para entender realmente la API y lo que está sucediendo, y necesita buenas pruebas tanto para los fracasos como para los éxitos en sus cadenas de promesas si desea tener alguna esperanza de construir sistemas de tal magnitud. en codebase tamaño.

HTH. Buena suerte con todo eso, es un viaje un poco accidentado.

Dado que JavaScript promete el código está estructurado como:

return promiseReturningFunction ();
}). entonces ((resultado) => {…

Hay una brecha entre la promesa y la tarea.

Mi problema ahora mismo fue con algo de copiar y pegar. Inserté un código entre algunos bloques de then() y no cumplí con la promesa devuelta con el then , causando cierta confusión.

Sí, hay dos errores que he descubierto con ES6 Promises y async / await.

El Promise gotcha puede suceder si está encadenando promesas usando las funciones de flecha, así:

someAsyncFunction ()
.then (() => someOtherAsyncFunction ())
.catch (handleError);

luego, si alguno de los someAsyncFunction o someOtherAsyncFunction arroja un error, será capturado por el .catch . Perfectamente seguro. Sin embargo si lo escribes así:

someAsyncFunction ()
.then (() => {
// algo de lógica …
// …
someOtherAsyncFunction ();
})
.catch (handleError);

luego, si someOtherAsyncFunction un error, corre el riesgo de obtener un UnhandledPromiseRejection, que puede terminar un proceso en versiones más nuevas de NodeJS. Esto se debe al hecho de que después de que se llame a someOtherAsyncFunction , esa función de flecha devolverá implícitamente implícitamente y la cadena de promesa finalizará.

El segundo es un gotcha similar en espera asíncrono.

Si ejecuta este código:

función asíncrona foo () {
const x = aguarda someAsyncAction (); // digamos que esto se resuelve 1
devuelve x;
}

barra de funciones asíncronas () {
tratar {
const y = espera foo ();
console.log (y);
} atrapar (err) {
handleError (err);
}
}

De nuevo, estás perfectamente a salvo. Si se someOtherAsyncAction errores de someOtherAsyncAction , la espera detectará el error lanzado por la Promesa rechazada y lo lanzará al alcance de la bar , donde quedará atrapado en el intento / captura y se manejará adecuadamente. Pero si se apresura y accidentalmente deja fuera la await en la línea 8, una vez más, se arriesga a recibir una Corrección de Promesa Unhandled.

UnhandledPromiseRejections nunca es algo bueno. Es por eso que NodeJS te alerta cuando se lanzan. Significa que en algún lugar su código se está rompiendo y la razón se está perdiendo en el éter, y como mencioné, en versiones posteriores de NodeJS esto resultará en la salida de su proceso actual.