异步javascript
异步编程的核心: 如今 与 稍后 的部分之间的关系。
例子: 去吃饭排队,先拿一个号,排到了手机会有消息收到。在这个时候,能够取买点喝的。java
如今:排队拿号 -> 买水 。
稍后:短信通知排到了,开吃!node
event loop 事件轮询es6
咱们将事件轮询理解成一个永动机,它一直会去找某一个队列【就能够理解成一个数组】里面的是否有执行的任务,若是有,那么会去执行。web
模拟代码:编程
var eventLoop = []; var event; // 永远执行 while (true) { // 检查队列是否有数据 // 执行一个tick if (eventLoop.length > 0) { event = eventLoop.shift(); try { event(); } catch(err) { reportError(err); // report Error stack info } } }
js引擎 遇到异步代码块,会将它放到【不必定是立刻】任务队列里面,当主线程执行完全部代码的时候,会从这个任务队列里面取任务,若是有就执行。数组
setTimeout 不会将回调放在事件轮询队列上,定时器超时的时候,环境才会把你的回调放进事件轮询,这样在将来的某个tick中将会被取出执行。promise
虽然说js是单线程,可是在事件轮询 和 并发模型机制上,并不是是单线程。 除了主线程callstack , 还有一个专门处理回调函数或者事件的线程(在浏览器里面就是webAPI,node里面就是线程 )。外面有一个task queue,这里就是回调等待的地方。浏览器
好比遇到了A , A 有一个回调,A函数执行了,A的回调放到了 另外的线程,另外的线程在知足必定条件(多是setTimeout 或者response响应)以后就会将这个回调放到 task queue 里面, callstack [必须]clear以后会立刻去task queue 里面一个一个执行这个队列的代码,执行完一个,task queue的这个就回收。并发
nice video: https://www.youtube.com/watch?v=8aGhZQkoFbQ
[大白话]: 主线程的代码执行完毕以后,而后会去task queue(任务队列)去执行队列中的任务。
因此
console.log("one") setTimeout(()=>{ console.log("two") }, 0) console.log("three")
结果会是:
"one" "three" "two"
而不是one two three
。
可是ES6 引入了promise generator async 等异步概念,他们是否是也是被放到了task queque呢。。答案是否认的。
在任意特定的时刻
,一次只有一个队列中的一个事件能够被处理,当事件执行的时候,它能够间接的或者直接的引起(致使)一个或者更多的后续事件。
es6引入了新的概念:job queque(工做队列)
, Promise的异步行为是基于job的
to be continued