Difference between microtask and macrotask within an event loop context

后端 未结 3 1233
一个人的身影
一个人的身影 2020-11-22 11:31

I\'ve just finished reading the Promises/A+ specification and stumbled upon the terms microtask and macrotask: see http://promisesaplus.com/#notes

I\'ve never heard

3条回答
  •  無奈伤痛
    2020-11-22 12:31

    Basic concepts in spec:

    • An event loop has one or more task queues.(task queue is macrotask queue)
    • Each event loop has a microtask queue.
    • task queue = macrotask queue != microtask queue
    • a task may be pushed into macrotask queue,or microtask queue
    • when a task is pushed into a queue(micro/macro),we mean preparing work is finished,so the task can be executed now.

    And the event loop process model is as follows:

    when call stack is empty,do the steps-

    1. select the oldest task(task A) in task queues
    2. if task A is null(means task queues is empty),jump to step 6
    3. set "currently running task" to "task A"
    4. run "task A"(means run the callback function)
    5. set "currently running task" to null,remove "task A"
    6. perform microtask queue
      • (a).select the oldest task(task x) in microtask queue
      • (b).if task x is null(means microtask queues is empty),jump to step (g)
      • (c).set "currently running task" to "task x"
      • (d).run "task x"
      • (e).set "currently running task" to null,remove "task x"
      • (f).select next oldest task in microtask queue,jump to step(b)
      • (g).finish microtask queue;
    7. jump to step 1.

    a simplified process model is as follows:

    1. run the oldest task in macrotask queue,then remove it.
    2. run all available tasks in microtask queue,then remove them.
    3. next round:run next task in macrotask queue(jump step 2)

    something to remember:

    1. when a task (in macrotask queue) is running,new events may be registered.So new tasks may be created.Below are two new created tasks:
      • promiseA.then()'s callback is a task
        • promiseA is resolved/rejected:  the task will be pushed into microtask queue in current round of event loop.
        • promiseA is pending:  the task will be pushed into microtask queue in the future round of event loop(may be next round)
      • setTimeout(callback,n)'s callback is a task,and will be pushed into macrotask queue,even n is 0;
    2. task in microtask queue will be run in the current round,while task in macrotask queue has to wait for next round of event loop.
    3. we all know callback of "click","scroll","ajax","setTimeout"... are tasks,however we should also remember js codes as a whole in script tag is a task(a macrotask) too.

提交回复
热议问题