w3schools trabajar promises promesas con await async asincronia anidadas javascript promise es6-promise

trabajar - promises javascript w3schools



¿Cómo depurar las promesas javascript? (6)

Estoy tratando de entender cómo depurar el código asíncrono basado en promesas. Promesas me refiero a las promesas basadas en ECMAScript 6 y al depurar me refiero al uso del depurador integrado de Chrome o Firefox.

Lo que estoy teniendo problemas es que, cuando ocurre un error, parece que no puedo obtener el seguimiento de la pila, no importa cómo lo ''rechace''.

Intenté estos:

console.log(new Error(''Error occured'')); throw new Error(''Throwing an Error''); return new Error(''Error returned by the onRejected function''); reject(new Error(''Pass Error to the reject function''));

Pero ninguno de esos devuelve el error real en el código o el seguimiento de la pila.

Entonces mi pregunta es: ¿cómo depurar correctamente las promesas de javascript?


Esta respuesta es una adición a la respuesta de Benjamin Gruenbaum: si usas una declaración catch en la cadena de promesas, obtendrás el stack stack por error . Stack :

Promise.longStackTraces(); function outer() { return Promise.resolve(); } function inner() { return Promise.resolve(); } function evenMoreInner() { a.b.c.d() } Promise.resolve() .then(outer) .then(inner) .then(evenMoreInner()) .catch(function (err) { console.log(err.message); console.log(err.stack); });

Mensaje de error:

ReferenceError: a is not defined at evenMoreInner (test/test_promise.js:58:17) <<<< HERE''s the error! at Context.<anonymous> (test/test_promise.js:64:23)


Este es un gran tema para debatir, la triste noticia es que esto es bastante difícil con las promesas nativas.

La depuración de las promesas de ES6 en Chrome es horrible. Esto se debe a que reprimirán los errores en silencio y siempre que omita una captura no le dará ninguna indicación de que la promesa falló. Actualización: Chrome ahora registra rechazos no controlados (ver este enlace para saber cómo)

Promise.resolve("foo").then(function(){ throw new Error("You will never see this");// silent failure });

En Firefox, las cosas son un poco mejores ya que realizan la detección de rechazo no controlada; sin embargo, sigue siendo escasa y si se le asigna la promesa en cualquier lugar, no funcionará.

¿Entonces, qué puede hacerse?

Incluye Bluebird : es un superconjunto de promesas de ES6 y puedes cambiarlo por dentro, tiene una API más rica, es más rápido y tiene sorprendentes rastros de pila . Está diseñado teniendo en cuenta la eliminación de fallas e incluye excelentes recursos para el manejo de errores.

Una vez que haya incluido Bluebird, llame a:

Promise.longStackTraces();

Lo cual ralentizará un poco (aún será muy rápido) y le dará sorprendentes mensajes de error. Por ejemplo:

Promise.resolve().then(function outer() { return Promise.resolve().then(function inner() { return Promise.resolve().then(function evenMoreInner() { a.b.c.d() }); }); });

En las promesas nativas, esto será una falla silenciosa y será muy difícil de depurar, con Bluebird promete que esto mostrará un gran error rojo en su consola de forma predeterminada que le da:

ReferenceError: a is not defined at evenMoreInner (<anonymous>:6:13) From previous event: at inner (<anonymous>:5:24) From previous event: at outer (<anonymous>:4:20) From previous event: at <anonymous>:3:9 at Object.InjectedScript._evaluateOn (<anonymous>:581:39) at Object.InjectedScript._evaluateAndWrap (<anonymous>:540:52) at Object.InjectedScript.evaluate (<anonymous>:459:21)

Una vez que haya terminado de depurar, puede cambiarlo y volver a las promesas nativas. Personalmente valoro saber que tengo errores en la producción, así que no lo recomiendo, pero es ciertamente factible.


La mejor manera de depurar lo prometido es escuchar el evento unhandledRejection de su process .

Por ejemplo, aquí es cómo puede configurarlo y volcar un seguimiento de pila ...

process.on(''unhandledRejection'', (reason, p) => { console.log(''Unhandled Rejection at: Promise'', p, ''reason:'', reason); // Stack Trace console.log(reason.stack); });


Parece que están trabajando con herramientas de depuración en Chrome. Mira este hilo para más información.

https://code.google.com/p/v8/issues/detail?id=3093

No he comprobado si esto ya está en la versión dev o en la versión beta, pero espero que sea pronto. Entonces podría incluirse en la versión normal en enero de 2015 más o menos (solo una suposición personal, absolutamente ninguna promesa, ya que ni siquiera trabajo para Google).


Puede agregar una declaración console.log () en la función .then () del objeto Promise: también puede agregar el .catch () si es necesario.

genericDbCaller(dbName, collectionName, dbFunctionName, params) { return new Promise((resolve, reject) => { DatabaseContext.instance.getDbConn(dbName) .then((dbConn) => { dbConn.get(collectionName)[dbFunctionName].apply(null, params) .then( (docs) =>{ ----->>> console.log(docs); resolve(docs); }) .catch((e)=>{


* Esto no responde directamente a su pregunta, pero puede ser útil, no obstante.

Chrome devtools recibió recientemente una nueva función que es útil para depurar código asíncrono, como Promises.

http://www.html5rocks.com/en/tutorials/developertools/async-call-stack/

Básicamente, habilite la casilla de verificación "asincrónico" en la pestaña de fuentes, y Chrome reconstruirá la pila de llamadas como si fuera un código sincrónico.