摘要:同步與異步以上為同步代碼,函數必須等函數執行完畢后才能執行。異步回調產生的結果就是,函數的調用并不直接返回結果,而往往是交給回調函數進行異步處理。
同步與異步:
function a(){} function b(){} a(); b();
以上為同步代碼,函數b必須等函數a執行完畢后才能執行。
function a(){ setTimeout(function(){ b(); }, 1000); }; function c(){}; a(); c();
首先執行函數a,而且不等setTimeout執行就執行函數c,等待至少1s的時候后才會執行函數b.實際上在是等待了1s后將函數b放到了event queue里面,此時要等待主線程空閑的時候,才會取event queue里面等待的回調函數進行執行。
以上是一段簡單的異步代碼,js里面最基礎的異步實現就是調用setTimeout,setInterval。
關于js的異步實現請看下面的list:
談談javascript的異步實現
回調函數:在js里面簡單點來說,就是函數被當作參數傳入另外一個函數當中,并在那個函數中被調用。
var b = function (){ //執行相關的代碼 } var a = function (b){ //執行相關的代碼 b(); } a(b);異步與回調:
大家可能平時聽的比較多的是異步回調,但是必須搞清楚,異步與回調并沒有直接的聯系,回調只是異步的一種實現方式。
當然還有同步回調,即上面回調部分舉的簡單的例子。一般使用回調函數主要是將父函數的執行結果通知給回調函數進行處理。
關于異步我的理解是:
因為js是單線程的,如果所有的操作(如ajax操作,獲取遠程的js文件等IO操作)是同步的,遇到那些耗時的操作,后面的程序必然被阻塞不能執行,頁面也就失去了響應。因此js采用了事件驅動機制,在單線程模型下,使用異步回調函數的方式來實現非阻塞的IO操作。
異步任務 是指js在主線程(stack)運行的過程當中,當stack空閑的時候,主線程對event queque輪詢(事實上一直在輪詢)后,將異步任務放到stack里面進行執行。簡單點說,只要指定過回調函數,那么當這些事件發生的時候就會進入事件隊列,等待主線程的stack空閑的時候,就會對event queue里面的回調讀取并放到stack里面執行。
看一段ajax實現的代碼:
var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); //第三個參數決定是否采用異步的方式 xhr.send(data); xhr.onreadystatechange = function(){ if(xhr.readystate === 4 && xhr.status === 200){ ///xxxx } }
這里ajax請求是異步的,因為瀏覽器會新開一個線程請求,當請求的狀態(readystate)發生改變,因為之前就設置了回調函數,每次狀態發生改變都會調用相應的回調函數,當(xhr.readystate === 4 && xhr.status === 200)的時候,回調函數進入了event queue,等待主線程空閑的時候,并且event queue里面排在這個回調前面沒有其他回調的時候就會得到執行。
異步回調產生的結果就是,函數的調用并不直接返回結果,而往往是交給回調函數進行異步處理。
因此在異步編程當中,需要注意幾個地方:
需要把依賴于異步函數(需要其執行結果或者達到某種狀態)的代碼放在對應的回調函數中(例如上面的ajax的例子)
異步函數后面的代碼會立即執行(因此需要知道某段代碼是否為異步的)
另外還有一個關于script標簽異步加載的內容:
大家記得請求遠程腳本標簽嗎?
在script標簽里面加入了async屬性或者defer屬性后,同樣變成了異步了。
關于這部分的內容,請移步:
async和defer的區別
另外關于這部分的內容還有一些List:
并發模型與event loop
樸靈評阮老師的event loop
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86138.html
摘要:而是在調用發出后,被調用者通過狀態通知來通知調用者,或通過回調函數處理這個調用。請求程序發出請求,從服務器端獲取數據,并設置了回調函數。然后,瀏覽器會設置偵聽來自網絡的響應,拿到數據后,將該回調函數插入到事件循環。 并發與并行 并發是指兩個或多個事件鏈隨時間發展交替執行,以至于從更高的層次來看,就像是同時運行(但在任意時刻只處理一個事件) 并發的關鍵是你有處理多個任務的能力,不一定同...
摘要:回調函數,一般在同步情境下是最后執行的,而在異步情境下有可能不執行,因為事件沒有被觸發或者條件不滿足。同步方式請求異步同步請求當請求開始發送時,瀏覽器事件線程通知主線程,讓線程發送數據請求,主線程收到 一直以來都知道JavaScript是一門單線程語言,在筆試過程中不斷的遇到一些輸出結果的問題,考量的是對異步編程掌握情況。一般被問到異步的時候腦子里第一反應就是Ajax,setTimse...
摘要:例如處理請求的線程處理事件的線程定時器線程讀寫文件的線程例如在中等等。事件循環事件循環是指主線程重復從消息隊列中取消息執行的過程。事件觸發時,表示異步任務完成,會將事件監聽器函數封裝成一條消息放到消息隊列中,等待主線程執行。 一. 單線程 我們常說JavaScript是單線程的。 所謂單線程,是指在JS引擎中負責解釋和執行JavaScript代碼的線程只有一個。不妨叫它主線程。 但是實...
摘要:單線程異步非阻塞然后,這又牽扯到了事件循環消息隊列,還有微任務宏任務這些。此步的位置不確定某個時刻后,定時器觸發線程通知事件觸發線程,事件觸發線程將回調函數加入消息隊列隊尾,等待引擎線程執行。 前言 Philip Roberts 在演講 great talk at JSConf on the event loop 中說:要是用一句話來形容 JavaScript,我可能會這樣: Java...
閱讀 3627·2023-04-26 02:32
閱讀 3904·2021-11-23 10:05
閱讀 2291·2021-10-08 10:04
閱讀 2711·2021-09-22 16:06
閱讀 3612·2021-09-22 15:27
閱讀 764·2019-08-30 15:54
閱讀 1698·2019-08-30 13:50
閱讀 2704·2019-08-29 13:56