美文网首页
JavaScript中的异步队列

JavaScript中的异步队列

作者: Spidd | 来源:发表于2021-06-23 15:38 被阅读0次

而在JavaScript中有两种异步宏任务macro-task和微任务micro-task.

在挂起任务时,JS 引擎会将所有任务按照类别分到这两个队列中,首先在 macrotask 的队列(这个队列也被叫做 task queue)中取出第一个任务,执行完毕后取出 microtask 队列中的所有任务顺序执行;之后再取 macrotask 任务,周而复始,直至两个队列的任务都取完。

常见的异步代码实现
macro-task: script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering

micro-task: process.nextTick, Promises(原生 Promise), Object.observe(api已废弃), MutationObserver

setTimeout(function() {
  console.log(1)
}, 0);
new Promise(function executor(resolve) {
  console.log(2);
  for( var i=0 ; i<10000 ; i++ ) {
    i == 9999 && resolve();
  }
  console.log(3);
}).then(function() {
  console.log(4);
});
console.log(5);
// 2 3 5 4 1
  1. 第一次整体代码进入macro-task。micro-task为空。
  2. macro-task执行整体代码,setTimeout加入下一次的macro-task。Promise执行打出2 3,then加入micro-task, 最后打出5。
  3. micro-task执行then被执行所以打出4。
  4. 重新执行macro-task所以打出1

Promise执行流程

  1. new Promise(func:(resolve, reject)=> void 0), 这里的func方法被同步执行。
  2. Promise 会有三种状态PENDING(执行),FULFILLED(执行成功),REJECTED(执行失败)。
  3. 在resolve,reject均未调用且未发生异常时状态为PENDING。
  4. resolve调用为FULFILLED,reject调用或者发生异常为REJECTED。
  5. 在给Promise实例调用then(callFulfilled, callRejected)来设置回调,状态不为PENDING时会根据状态调用callFulfilled和callRejected。
  6. then需要返回一个新的Promise实例.
  7. 状态为PENDING则会把callFulfilled和callRejected放入当前Promise实例的回调队列中,队列还会存储新的Promise实例。
  8. 在状态改变为FULFILLED或REJECTED时会回调当前Promise实例的队列。

相关文章

  • JavaScript中的异步队列

    而在JavaScript中有两种异步宏任务macro-task和微任务micro-task. 在挂起任务时,JS ...

  • js笔记

    Javascript 事件循环: js解析方法时,将同步任务排队到执行栈中,异步任务排队到事件队列中。 事件队列分...

  • 问题点整理发布列表(未完待续...)

    1,JavaScript异步队列问题 https://juejin.im/post/59cce3675188250...

  • JavaScript事件循环机制

    JavaScript单线程执行 同步栈执行完成后,再执行异步队列 异步队列中分为宏任务和微任务 微任务比宏任务优先...

  • GCD

    1、同步串行队列 2、同步并行队列 3、异步串行队列 4、异步并行队列 5、死锁 主线程中创建同步串行队列 主线程...

  • Javascript异步编程

    同步模式与异步模式 事件循环与消息队列   JavaScript 单线程指的是浏览器中负责解释和执行 JavaSc...

  • ES6 之 Promise

    Promise是JavaScript异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • AskMe项目 异步队列

    异步队列简单介绍 队列实现异步可以用单向队列,任务放到队列中,先进先出,或者使用优先队列,按照优先级来选择谁先执行...

  • GCD的几种创建方式及基本使用

    同步函数 同步函数+主队列 同步函数+串行队列 同步函数+并发队列 异步函数 异步函数+主队列 异步函数+串行队列...

网友评论

      本文标题:JavaScript中的异步队列

      本文链接:https://www.haomeiwen.com/subject/utpbyltx.html