中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中從setTimeout與setInterval到AJAX異步的示例分析

發布時間:2021-08-11 11:57:23 來源:億速云 閱讀:176 作者:小新 欄目:web開發

這篇文章主要介紹JavaScript中從setTimeout與setInterval到AJAX異步的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

setTimeout與setInterval執行

  首先我們看一下以下代碼打印結果

console.log(1);
setTimeout(function() { console.log(2); },100)
setTimeout(function() { console.log(3); },50)
console.log(4);

  打印結果是 1、4、3、2,你可能覺得理所應當,那我們再看下下面這個例子

console.log(1);
setTimeout(function() { console.log(2); },0)
console.log(3);

  這次的結果又會是什么呢?

  1、3、2,不是1、2、3。到這里你可能會有疑惑了,明明定時器設置的時間為0,而且瀏覽器解析js是按照從上到下執行的,應該是1、2、3才對啊?

  到這里我們要提一下瀏覽器的線程問題。

  與js相關的瀏覽器線程有三個(注意:js解析是單線程) - js代碼執行線程( 主線程 ) - UI渲染線程 - 事件循環線程

  其中js代碼執行線程與UI渲染線程兩者是互斥的,也就是說js代碼執行線程運行的時候,UI渲染線程會停止工作,這樣做也是為了防止js中的DOM操作會導致兩線程沖突;而事件循環線程比較特殊,接下來會根據setTimerout的執行過程進行講解其作用。

  回到上面的第一道題目

console.log(1);
 setTimeout(function() { console.log(2); },100)
 setTimeout(function() { console.log(3); },50)
 console.log(4);

   執行過程:

js主線程運行,遇到console.log(1),直接運行,在控制臺輸出結果;

主線程繼續運行,然后遇到第一個setTimeout,接著setTimeout中的回調函數會被放入到一個事件隊列中(這里的事件隊里可以想象成一個備忘錄,里面記錄的全是一些需要做而未做的事);

遇到第二個setTimeout,其中的回調函數依然被加入到事件隊列中;

執行console.log(4),到這里主線程的任務全部執行完畢,除了setTimeout里面的回調函數;

這個時候,我們還未說明的事件循環線程開始工作,它會去循環遍歷事件隊列(也就是我們的備忘錄),如果事件隊列中有回調函數,它就會將事件隊列中的回調函數重新交給主線程;

主線程收到回調函數,然后開始執行函數體。(這里要注意,因為兩個setTimeout本身有執行時間,所以在這里的時候就會根據時間的長短按順序執行啦。)

  setInterval原理與之相同,不作另說。

  總的來說,setTimeout與setInterval的執行會等到主線程的所有任務全部執行后,才會再執行其中的回調函數,所以在使用它們的時候也要注意,特別是在主線程中有特別耗時的任務的時候,兩種定時器會被不可預測的延后。

  講到這里,大家有沒有想到什么呢?

  恩,就是異步,setTimeout的執行有沒有一點異步的感覺呢?但又因為它必須是等到主線程全部執行完才會執行,所以可以稱之為偽異步。

  說到異步,我們還會想到AJAX,都說AJAX是異步,但是它異步的原理想必還不清楚的你應該有點興趣了解的。

  異步:簡單說就是在處理某一件事的時候還可以去做別的事,比如:你在銀行取號后等待取錢,在等待的過程中你還可以玩手機,和別人聊天等等,這個過程就是異步的。

AJAX 異步的原理

發送一個AJAX請求的時候,瀏覽器會有一個專門的線程來進行該任務;

而在AJAX中也是有回調函數的,比如請求成功后的回調,失敗后的回調,這些回調函數與setTimeout中的回調一樣會被推入到事件隊列中;

瀏覽器接會再次提供一個縣城接收AJAX請求返回的數據;

事件循環線程這時候知道事件隊列中AJAX的回調函數能夠被執行了,遍歷事件隊列,將其中的回調函數交回給js主線程;

主線程執行AJAX回調函數內部代碼。

以上是“JavaScript中從setTimeout與setInterval到AJAX異步的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北海市| 玉溪市| 巨野县| 西贡区| 探索| 甘孜| 乐山市| 金门县| 亳州市| 锡林郭勒盟| 武胜县| 涟水县| 承德县| 绿春县| 原平市| 平阳县| 色达县| 阿克陶县| 肥西县| 章丘市| 当雄县| 巧家县| 武邑县| 塘沽区| 西宁市| 鄂温| 布拖县| 新郑市| 抚州市| 锡林郭勒盟| 鸡西市| 滦平县| 喜德县| 江都市| 深水埗区| 古丈县| 苏尼特右旗| 龙胜| 长岭县| 门源| 慈利县|