informatica:programacion:cursos:programacion_avanzada_javascript:promises
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| informatica:programacion:cursos:programacion_avanzada_javascript:promises [2024/10/15 11:39] – [DEMO: Errores en promises] tempwin | informatica:programacion:cursos:programacion_avanzada_javascript:promises [2024/10/30 15:52] (actual) – [DEMO: Errores en promises] tempwin | ||
|---|---|---|---|
| Línea 211: | Línea 211: | ||
| </ | </ | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | then devuelve | + | |
| - | </ | + | |
| Línea 227: | Línea 225: | ||
| </ | </ | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | then devuelve | + | |
| - | </ | + | |
| Y el tercer ejemplo muestra que, si la función que se pasa a '' | Y el tercer ejemplo muestra que, si la función que se pasa a '' | ||
| Línea 249: | Línea 245: | ||
| Hasta que no se resuelva la //promise// " | Hasta que no se resuelva la //promise// " | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | la promise de then depende de la promise interna | + | |
| - | </ | + | |
| Con estos ejemplos espero que quede más claro cómo funciona el encadenamiento de // | Con estos ejemplos espero que quede más claro cómo funciona el encadenamiento de // | ||
| Línea 547: | Línea 541: | ||
| </ | </ | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | caja de TODO | + | |
| - | </ | + | |
| ===== DEMO: Composición de Promises ===== | ===== DEMO: Composición de Promises ===== | ||
| Línea 618: | Línea 610: | ||
| </ | </ | ||
| - | <WRAP center round todo 60%> | + | {{ : |
| - | Promises en error ejecutan | + | |
| - | </ | + | |
| El método '' | El método '' | ||
| Línea 636: | Línea 626: | ||
| var pr = new Promise(function(resolve, | var pr = new Promise(function(resolve, | ||
| if (res < 0) { | if (res < 0) { | ||
| - | | + | |
| + | reject(new Error(" | ||
| + | } | ||
| + | // Por si se generase algún otro tipo de error, lo capturamos | ||
| + | try { | ||
| + | window.setTimeout(function() { resolve(res)}, | ||
| + | } | ||
| + | catch (e) { | ||
| + | reject(e); | ||
| } | } | ||
| - | window.setTimeout(function() { resolve(res)}, | ||
| }); | }); | ||
| Línea 663: | Línea 660: | ||
| console.log(" | console.log(" | ||
| </ | </ | ||
| + | |||
| + | ===== ¿Cómo limitar el tiempo máximo de ejecución de una Promise? ===== | ||
| + | |||
| + | Si la API que usamos dentro de la //Promise// ofrece algún mecanismo de // | ||
| + | |||
| + | Por lo tanto el mecanismo es muy sencillo. Esta función toma una Promise y devuelve otra con un timeout: | ||
| + | |||
| + | <code javascript> | ||
| + | const TimeoutPromise = (pr, timeout) => | ||
| + | Promise.race([pr, | ||
| + | setTimeout(rej, | ||
| + | )]); | ||
| + | </ | ||
| + | |||
| + | Su uso es muy sencillo: | ||
| + | |||
| + | <code javascript> | ||
| + | let pr = fetch(' | ||
| + | let tpr = TimeoutPromise(pr, | ||
| + | .then(() => console.log(' | ||
| + | .catch(() => | ||
| + | </ | ||
| + | |||
| + | La //promise// '' | ||
| + | |||
| + | Más fácil imposible, ¿verdad? | ||
| + | |||
| + | Bien, nada es perfecto: este método cuando se rechaza la promise por el timeout, **el resto de promises internas siguen ejecutándose**. Es decir, en nuestro caso, tpr es rechazada al cabo de 500ms, pero la promise pr se sigue ejecutando durante los 8s (hasta que se completa la petición de red). Por lo tanto **este mecanismo no aborta promises**. Se limita a envolverlas con una promesa que, esta sí, se resuelve/ | ||
| + | |||
| + | Lo ideal sería poder cancelar la promise, pero ECMAScript no ofrece un mecanismo para poder hacerlo, aunque [[https:// | ||
| + | |||
| + | ==== " | ||
| + | |||
| + | Existen [[https:// | ||
| + | |||
| + | <code javascript> | ||
| + | const token = function() { | ||
| + | return { | ||
| + | cancel: function () {this.isCancelled = true}, | ||
| + | isCancelled: | ||
| + | } | ||
| + | } | ||
| + | async function | ||
| + | { | ||
| + | for (let f of iterf) { | ||
| + | await f(); | ||
| + | if (token.isCancelled) | ||
| + | throw ' | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Bueno, como puedes ver el código es trivial: simplemente itera por el iterable de promises si por alguna razón el token se cancela. | ||
| + | |||
| + | Su uso es, de nuevo, muy sencillo: | ||
| + | |||
| + | <code javascript> | ||
| + | const func = () => fetch( | ||
| + | ' | ||
| + | {mode: ' | ||
| + | const tok = token(); | ||
| + | const pr = MultistepPromise([func, | ||
| + | .then(() => console.log(' | ||
| + | .catch((e) => console.log(' | ||
| + | </ | ||
| + | |||
| + | Si una vez '' | ||
| + | |||
| + | Observa que '' | ||
| + | |||
| + | Por supuesto, puedes combinar ambas técnicas: es decir, hacer una '' | ||
| + | ===== Recursos ===== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
informatica/programacion/cursos/programacion_avanzada_javascript/promises.1728985157.txt.gz · Última modificación: por tempwin
