Web 開發容許 js 程序的一部分在一個獨立的線程中運行,該線程能夠與 js 主線程並行運行;可是這並不意味着咱們能夠在 js 程序中引入多線程操做,由於在多線程操做中兩個獨立的線程之間是能夠經過異步事件相互通訊的,他們彼此之間經過事件輪詢機制(event-loop)一次一個的來運行,所以在咱們使用 setTimeOut 的時候,多個 setTimeOut 之間實際上是會存在時間上的偏差,形成這個偏差的緣由就是 javaScript 的單線程機制;java
es6 中的 generators 函數容許在運行的過程當中暫停一次或者屢次,隨後再恢復;暫停的過程當中容許其它的代碼執行;genrators 函數中的併發機制使用的是 coopeerative 類型的併發機制,經過使用新的 yield 關鍵字從內部將函數的運行打斷;並且在下一次從新啓動的時候再傳入值;es6
在進程中存在兩個概念:協做(cooperative) 和 搶佔(preemptive);cooperative 說明一個進程自己能夠選擇什麼時候被中斷以便與其它代碼進行協做;preemptive 恰好是和 cooprative 相反的,它代表一個進程或 function 能夠被其自身的意願打斷;多線程
generators 的命名,例如 function *foo();在函數中經過 yield 進行暫停,經過 next() 方法或者函數自己進行再次的啓動,調用 next() 方法的時候都會返回一個對象 { value: val, done:false} ;value 是 暫停時候的返回值;可是這個並非 returen 語句的返回值,而是 yield 表達式的值;done 表示函數有沒有運行完成;在 generators 函數中是不建議使用 return 的;併發