informatica:programacion:cursos:programacion_avanzada_javascript:promises
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previa | |||
| informatica:programacion:cursos:programacion_avanzada_javascript:promises [2024/10/30 15:49] – [Recursos] tempwin | informatica:programacion:cursos:programacion_avanzada_javascript:promises [2024/10/30 15:52] (actual) – [DEMO: Errores en promises] tempwin | ||
|---|---|---|---|
| Línea 661: | Línea 661: | ||
| </ | </ | ||
| + | ===== ¿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 ===== | ===== Recursos ===== | ||
informatica/programacion/cursos/programacion_avanzada_javascript/promises.1730299757.txt.gz · Última modificación: por tempwin
