javascript延时函数 js延迟1秒的方法( 二 )


相同点:
都用作先进先出队列相异点:
每个 JavaScript Runtime 可以有多个 Job Queue , 但只有一个 Event Loop Queue当 JavaScript Engine 处理完当前 chunk 后 , 优先执行所有的 Job Queue , 然后再处理 Event Loop QueueES6 中 , 一个 Promise 就是一个 PromiseJob , 一种 Job 。
再来观察一段小程序:
console.log("A");setTimeout(() => {console.log("A - setTimeout");}, 0);new Promise((resolve) => {resolve();}).then(() => {return console.log("A - Promise 1");}).then(() => {return console.log("B - Promise 1");});new Promise((resolve) => {resolve();}).then(() => {return console.log("A - Promise 2");}).then(() => {return console.log("B - Promise 2");}).t**粗体文字**hen(() => {return console.log("C - Promise 2");});console.log("AA");在原生支持 Promise 的环境 , 输出是这样:
A
AA
A – Promise 1
A – Promise 2
B – Promise 1
B – Promise 2
C – Promise 2
A – setTimeout
理解这个输出:
A 与 AA 最先输出 , 因为它们不是异步任务 , 属于第一个 chunk 。Promise 1 与 Promise 2 先于 setTimeout 执行 , 因为 Job Queue 的执行优先于 Event Loop Queue 。Promise 1 与 Promise 2 各自的输出都是顺序的 , 因为 Job Queue 是先进先出队列 , 同一 Job Queue 中的任务顺序执行 。Promise 1 与 Promise 2 的后续任务是交错的 , 因为 Promise 1 与 Promise 2 都是独立的 PromiseJob(job 的其中一种) , 属于不同的 Job Queue , 它们之间的顺序规范中没有规定 。并发文章开头 , 我说「简单地说 , JavaScript 是单线程执行的语言」 , 现在可以说得稍微复杂一点了:JavaScript Engine 对 JavaScript 程序的执行是单线程的 , 但是 JavaScript Runtime(整个宿主环境)并不是单线程的;而且 , 几乎所有的异步任务都是并发的 , 例如多个 Job Queue、Ajax、Timer、I/O(Node)等等 。
上面说的是 JavaScript Runtime 层面 , JavaScript 执行本身 , 也有一些特殊情况 , 例如:一个 Web Worker 或者一个跨域的 iframe , 也是独立的线程 , 有各自的内存空间(栈、堆)以及 Event Loop Queue 。要与这些不同的线程通信 , 只能通过 postMessage 。一次 postMessage 就是在另一个线程的 Event Loop Queue 中加入一条消息 。
参考资料Concurrency model and Event Loop
ECMAScript? 2015 Language Specification
You Don’t Know JS: Async & Performance
JavaScript异步编程:设计快速响应的网络应用


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: