- Notifications
You must be signed in to change notification settings - Fork230
Microtasks#280
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Merged
Uh oh!
There was an error while loading.Please reload this page.
Merged
Microtasks#280
Changes fromall commits
Commits
Show all changes
12 commits Select commitHold shift + click to select a range
8c2769f
microtasks
vplentinax9b0e21b
Update article.md
vplentinaxcc8313c
Update article.md
vplentinaxffaf1fd
Update 1-js/11-async/07-microtask-queue/article.md
vplentinax864bd4d
Update 1-js/11-async/07-microtask-queue/article.md
vplentinaxb636da4
Update 1-js/11-async/07-microtask-queue/article.md
vplentinax76075aa
Update 1-js/11-async/07-microtask-queue/article.md
vplentinax58241d2
Update 1-js/11-async/07-microtask-queue/article.md
vplentinax8c5a040
Update 1-js/11-async/07-microtask-queue/article.md
vplentinax8a82814
Update 1-js/11-async/07-microtask-queue/article.md
vplentinax24cbe56
Update 1-js/11-async/07-microtask-queue/article.md
vplentinax82b3221
Update 1-js/11-async/07-microtask-queue/article.md
vplentinaxFile filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
94 changes: 47 additions & 47 deletions1-js/11-async/07-microtask-queue/article.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,112 +1,112 @@ | ||
#Microtareas (Microtasks) | ||
Los manejadores o controladores (en adelante controladores) de promesas`.then`/`.catch`/`.finally`son siempre asincrónicos. | ||
Incluso cuando una promesa es inmediatamente resuelta, el código en las líneas *debajo de* `.then`/`.catch`/`.finally`se ejecutará antes que estos controladores. | ||
Veamos una demostración: | ||
```js run | ||
let promise = Promise.resolve(); | ||
promise.then(() => alert("¡Promesa realizada!")); | ||
alert("código finalizado"); //esta alerta se muestra primero | ||
``` | ||
Si ejecutas esto, verás `código finalizado` primero, y después `¡promesa realizada!`. | ||
Es algo extraño, porque la promesa se realiza por completo desde el principio. | ||
¿Por qué`.then`se disparó después? ¿Qué está pasando? | ||
##Cola de microtareas (Microtasks queue) | ||
Las tareas asincrónicas necesitan una gestión adecuada. Para ello, el estándarECMAespecifica una cola interna`PromiseJobs`,en ocasiones más conocida como "cola de microtareas" (término ES8). | ||
Como se indica en la [especificación](https://tc39.github.io/ecma262/#sec-jobs-and-job-queues): | ||
-La cola es first-in-first-out (FIFO), es decir, primero en entrar primero en salir: la tarea que entró primero en la cola, será la primera en ejecutarse. | ||
-La ejecución de una tarea se inicia sólo cuando *no* se está ejecutando nada más. | ||
O, en palabras más simples, cuando una promesa está lista, sus controladores`.then/catch/finally`se ponen en la cola; ellos aún no se ejecutan. Cuando el motor de Javascript se libera del código actual, toma una tarea de la cola y la ejecuta. | ||
Es por eso que el "código finalizado" en el ejemplo anterior se muestra primero. | ||
 | ||
Los controladoes de promesas siempre pasan por esta cola interna. | ||
Si hay una cadena con múltiples `.then/catch/finally`,entonces cada uno de ellos se ejecuta de forma asincrónica. Es decir, primero se pone en la cola, luego se ejecuta cuando se completa el código actual y se finalizan los controladores previamente en la cola. | ||
**¿Qué pasa si lo que estamos pidiendo es importante? ¿Cómo podemos hacer que `código finalizado` se ejecute después de `¡promesa realizada!`?** | ||
Fácil, solo ponlo en la cola con `.then`: | ||
```js run | ||
Promise.resolve() | ||
.then(() => alert("promesa realiazada!")) | ||
.then(() => alert("código finalizado")); | ||
``` | ||
Ahora el orden es el previsto. | ||
##Rechazo no controlado | ||
Recuerdas el evento`unhandledrejection`del artículo <info:promise-error-handling>? | ||
Ahora podemos ver exactamente cómo Javascript descubre que hubo un rechazo no controlado o *unhandled rejection* | ||
**Se produce un "rechazo no controlado" cuando no se maneja unerrorde promesa al final de la cola de microtareas.** | ||
Normalmente, si esperamos unerror,agregamos`.catch`a la cadena de promesa para manejarlo: | ||
```js run | ||
let promise = Promise.reject(new Error("¡Promesa fallida!")); | ||
*!* | ||
promise.catch(err => alert('atrapado')); | ||
*/!* | ||
//no se ejecuta: errorcontrolado | ||
window.addEventListener('unhandledrejection', event => alert(event.reason)); | ||
``` | ||
Pero si olvidas añadir el`.catch`,entonces, después de que la cola de microtareas esté vacía, el motor activa el evento: | ||
```js run | ||
let promise = Promise.reject(new Error("¡Promesa fallida!")); | ||
//Promesa fallida! | ||
window.addEventListener('unhandledrejection', event => alert(event.reason)); | ||
``` | ||
¿Qué pasa si controlamos el errormás tarde? Como esto: | ||
```js run | ||
let promise = Promise.reject(new Error("¡Promesa fallida!")); | ||
*!* | ||
setTimeout(() => promise.catch(err => alert('atrapado')), 1000); | ||
*/!* | ||
// Error:¡Promesa fallida! | ||
window.addEventListener('unhandledrejection', event => alert(event.reason)); | ||
``` | ||
Ahora si lo ejecutamos, veremos `¡Promesa fallida!`primero y después `atrapado`. | ||
Si no supiéramos acerca de la cola de microtareas podríamos preguntarnos: "¿Por qué se ejecutó el controlador`unhandledrejection`? ¡Capturamos y manejamos elerror! | ||
Pero ahora entendemos que`unhandledrejection`se genera cuando se completa la cola de microtareas: el motor examina las promesas y, si alguna de ellas está en el estado "rechazado", entonces el evento se dispara. | ||
En el ejemplo anterior, `.catch`agregado por `setTimeout`también se dispara. Pero lo hace más tarde, después de que`unhandledrejection`ya ha ocurrido, por lo que no cambia nada. | ||
##Resumen | ||
El control de promesas siempre es asíncrono, ya que todas las acciones de promesa pasan por la cola interna de "PromiseJobs", también llamada "cola de microtareas" (término ES8). | ||
Entonces, los controladores`.then/catch/finally`siempre se llaman después de que el código actual ha finalizado. | ||
Si necesitamos garantizar que un código se ejecute después de`.then/catch/finally`,podemos agregarlo a una llamada encadenada`.then`. | ||
En la mayoría de los motores de Javascript, incluidos los navegadores yNode.js,el concepto de microtareas está estrechamente relacionado con el "bucle de eventos" o "event loop"y "macrotareas" o "macrotasks".Como estosnotienen relación directa con las promesas, están cubiertos en otra parte del tutorial,en el artículo <info:event-loop>. |
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.