Je viens de terminer la lecture de la spécification Promises / A + et je suis tombé sur les termes microtask et macrotask: voir http://promisesaplus.com/#notes
Je n'ai jamais entendu parler de ces termes auparavant, et maintenant je suis curieux de savoir quelle pourrait être la différence?
J'ai déjà essayé de trouver des informations sur le web, mais tout ce que j'ai trouvé est ce post des archives de w3.org (qui ne m'explique pas la différence): http://lists.w3.org/Archives /Public/public-nextweb/2013Jul/0018.html
De plus, j'ai trouvé un module npm appelé "macrotask": https://www.npmjs.org/package/macrotask Encore une fois, il n'est pas précisé quelle est exactement la différence.
Tout ce que je sais, c'est que cela a quelque chose à voir avec la boucle d'événements, comme décrit dans https://html.spec.whatwg.org/multipage/webappapis.html#task-queue et https: //html.spec.whatwg .org / multipage / webappapis.html # perform-a-microtask-checkpoint
Je sais que je devrais théoriquement être capable d'extraire moi-même les différences, étant donné cette spécification WHATWG. Mais je suis sûr que d'autres pourraient également bénéficier d'une brève explication donnée par un expert.
la source
while (task = todo.shift()) task();
Réponses:
Une remise des gaz de la boucle d'événements aura exactement une tâche en cours de traitement à partir de la file d'attente macrotask (cette file d'attente est simplement appelée la file d'attente des tâches dans la spécification WHATWG ). Une fois ce macrotask terminé, toutes les microtâches disponibles seront traitées, à savoir dans le même cycle de . Pendant que ces microtâches sont traitées, elles peuvent mettre en file d'attente encore plus de microtâches, qui seront toutes exécutées une par une, jusqu'à ce que la file d'attente de microtâches soit épuisée.
Quelles en sont les conséquences pratiques?
Si une microtâche file d'attente de manière récursive d'autres microtâches, le traitement de la prochaine macrotask peut prendre un certain temps. Cela signifie que vous pourriez vous retrouver avec une interface utilisateur bloquée ou une certaine inactivité des E / S dans votre application.
Cependant, au moins en ce qui concerne la fonction process.nextTick de Node.js (qui met en file d'attente les microtâches ), il existe une protection intégrée contre un tel blocage au moyen de process.maxTickDepth. Cette valeur est définie par défaut sur 1000, ce qui réduit le traitement ultérieur des microtâches une fois cette limite atteinte, ce qui permet de traiter la prochaine macrotask )
Alors, quand utiliser quoi?
Fondamentalement, utilisez des microtâches lorsque vous avez besoin de faire des choses de manière asynchrone de manière synchrone (c'est-à-dire lorsque vous diriez effectuer cette (micro-) tâche dans un avenir le plus immédiat ). Sinon, tenez-vous-en aux macrotasks .
Exemples
macrotasks: setTimeout , setInterval , setImmediate , requestAnimationFrame , I / O ,
microtâches de rendu de l'interface utilisateur: process.nextTick , Promises , queueMicrotask , MutationObserver
la source
process.maxTickDepth
a été supprimé il y a très longtemps: github.com/nodejs/node/blob/…Concepts de base dans les spécifications :
Et le modèle de processus de boucle d'événements est le suivant:
lorsque la pile d'appels est vide, suivez les étapes
un modèle de processus simplifié est le suivant:
Quelque chose dont il faut se souvenir:
la source
setImmediate()
est macro / tâche etprocess.nextTick()
est un micro / travail.paint
tâches du navigateur ? Dans quelle catégorie s'inscriraient-ils?requestAnimationFrame
)Je pense que nous ne pouvons pas discuter de la boucle d'événements en séparation de la pile, donc:
JS a trois "piles":
Et la boucle d'événement fonctionne de cette façon:
La pile de Mico ne sera pas touchée si la pile n'est pas vide. La pile de macros ne sera pas touchée si la micro-pile n'est pas vide OU ne nécessite aucune exécution.
Pour résumer: la file d'attente de microtask est presque la même que la file d'attente de macrotask, mais ces tâches (process.nextTick, Promises, Object.observe, MutationObserver) ont une priorité plus élevée que les macrotasks.
Le micro est comme la macro mais avec une priorité plus élevée.
Ici vous avez le code "ultime" pour tout comprendre.
la source