国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

for循環里使用 setTimeout 和 回調函數 常見的問題

newtrek / 2602人閱讀

摘要:問題一位同學在循環里連續發送了個請求,然后在的回調函數里使用了自增變量,但是值并不總能達到他的正確期望,經常出現問題。解決方法把或部分抽離成一個函數,然后傳值調用它。這樣在函數里會保存的一個副本,從而保證和期望效果一致。

問題

一位同學在for循環里連續發送了4個ajax請求,然后在success的回調函數里使用了自增變量i,但是i值并不總能達到他的正確期望,經常出現問題。

我把這個問題同理描述為setTimeout的使用:

// 代碼一
for (var i = 0; i < 4; i++) {
    setTimeout(function(){
        console.log(i);
    }, 0);
}
// 輸出結果如下
// 4
// 4
// 4
// 4
原因

JavaScript是單線程執行的,setTimeout函數會被放到任務隊列里等待執行(即使等待時間為0),當for循環執行完之后,i的值已經變成了 4

ajax請求的回調函數也是這樣,加上同時發送多個請求,它們的返回順序也并不總是和發送順序一致。

解決方法

setTimeoutajax部分抽離成一個函數,然后傳值調用它。這樣在函數里會保存i的一個副本,從而保證和期望效果一致。

// 代碼二
function callback(temp){
    setTimeout(function(){
        console.log(temp);
    }, 0);
}
for (var i = 0; i < 4; i++) {
    callback(i);
}
// 輸出結果如下
// 0
// 1
// 2
// 3

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/81598.html

相關文章

  • [Javascript實驗課]循環閉包

    摘要:執行出來的結果是這樣的實驗發現,無論如何都在最后執行,這證實了我們之前遇到的問題,因為在循環結束才執行,所以回調函數調用的取值必然是循環的最后一次。 前言 https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Closures MDN上描述閉包的章節闡述了一個由于閉包產生的常見錯誤,代碼片段是這樣的 for (var i...

    teren 評論0 收藏0
  • Javascript 面試中經常被問到三個問題

    摘要:相反,在討論時,面試中通常會提到三件事。而認為最后一個參賽者說了算,只要還能吃的,就重新設定新的定時器。試想,如果用戶的操作十分頻繁他每次都不等設置的時間結束就進行下一次操作,于是每次都為該用戶重新生成定時器,回調函數被延遲了不計其數次。本文不是討論最新的 JavaScript 庫、常見的開發實踐或任何新的 ES6 函數。相反,在討論 JavaScript 時,面試中通常會提到三件事。我自己...

    chnmagnus 評論0 收藏0
  • Javascript 面試中經常被問到三個問題

    摘要:相反,在討論時,面試中通常會提到三件事。通過對事件對應的回調函數進行包裹以自由變量的形式緩存時間信息,最后用來控制事件的觸發頻率。而認為最后一個參賽者說了算,只要還能吃的,就重新設定新的定時器。 showImg(https://segmentfault.com/img/bVboH5x?w=1000&h=750); 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 本...

    PrototypeZ 評論0 收藏0
  • 大話javascript 4期:事件循環(2)

    摘要:只要指定過回調函數,這些事件發生時就會進入任務隊列,等待主線程讀取。三主線程從任務隊列中讀取事件,這個過程是循環不斷的,所以整個的這種運行機制又稱為事件循環。 一、任務隊列 同步任務與異步任務的由來 單線程就意味著,所有任務需要排隊,前一個任務結束,才會執行后一個任務。如果前一個任務耗時很長,后一個任務就不得不一直等著。 如果排隊是因為計算量大,CPU忙不過來,倒也算了,但是很多時候C...

    李昌杰 評論0 收藏0
  • 夯實基礎-JavaScript異步編程

    摘要:調用棧被清空,消息隊列中并無任務,線程停止,事件循環結束。不確定的時間點請求返回,將設定好的回調函數放入消息隊列。調用棧執行完畢執行消息隊列任務。請求并發回調函數執行順序無法確定。 異步編程 JavaScript中異步編程問題可以說是基礎中的重點,也是比較難理解的地方。首先要弄懂的是什么叫異步? 我們的代碼在執行的時候是從上到下按順序執行,一段代碼執行了之后才會執行下一段代碼,這種方式...

    shadowbook 評論0 收藏0

發表評論

0條評論

newtrek

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<