異步

爲何Javascript得是單線程?html

  JS單線程:假如再對DOM進行操做的時候,多個線程同時刪除和添加的時候,就會出現問題編程

單線程形成的問題:多線程

  一個任務執行完成以後才能執行下一個,若是是在讀取大量數據的文件的時候,這隻能是先將大文件讀取以後才能繼續執行以後的任務。這就形成了時間上的沒必要要浪費。因而就有了多線程異步

如何實現異步:async

  1.主線程上有一個"執行棧",其中存放着全部的同步任務異步編程

  2.還有一個「任務隊列」(先進先出),存放着有告終果?(啥就有結果了)的異步任務函數

  3.當全部的同步任務都結束以後(執行棧爲空的時候),就檢查異步任務隊列中的任務是否能夠放到主線程執行(例如:定時器任務,得等到時間才能執行)oop

異步任務隊列:線程

  異步任務隊列中異步任務主要是 1.IO事件的異步任務 2.用戶的交互事件:點擊事件等  這些事件經過回調函數來表現,也就是說指定相對應的回調函數,放到異步任務中,當執行棧執行異步任務的時候就是在執行相對應的回調函數。htm

任務有同步任務和異步任務,同步任務就是按主線程的執行順序執行,即便是遇到大量數據的讀取這樣的操做的時候,也得先等待讀取操做結束,再繼續執行以後的任務;異步任務是:遇到像讀取大量數據的操做的時候,就執行後面的同步任務,將讀取大量數據的操做結果放到異步任務中(?)

異步編程:

  1.傳統:回調函數

  2.Promise

  3.Generator

  4.async

  傳統的調用方式回調函數,當遇到多個異步任務並須要按照必定的順序執行的時候,可能會出現「回調地獄」問題。

  Promise經過將異步任務經過鏈式的方式,實現多個異步任務的順序執行,必定程度上避免了回調地獄的問題。

  Generatot經過yield來暫停任務的執行,next恢復執行,當前異步任務結局一個以後就next

  async是ES6的語法糖,本質上就是Generator,可是Generator須要本身手動執行(手動調用next函數),async徹底是自動執行異步任務的。

  

來源:https://juejin.im/entry/58f952c2a22b9d006589f77d

來源:http://www.ruanyifeng.com/blog/2014/10/event-loop.html

相關文章
相關標籤/搜索