最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript異步執(zhí)行不按順序解決方案

 更新時(shí)間:2020年04月30日 09:50:34   作者:林中有風(fēng)  
這篇文章主要介紹了Javascript異步執(zhí)行不按順序解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

案例分析:

比如執(zhí)行懶加載時(shí)候,onscroll 事件觸發(fā)多次事件時(shí)候會(huì)調(diào)用多次 ajax 回調(diào)事件,由于每個(gè)事件返回先后次序并不能保證和觸發(fā)前一致,所以在數(shù)據(jù)響應(yīng)返回后所添加的數(shù)據(jù)順序就很在 push 到數(shù)組上順序不一致。

例子1:

var res = [];
   function response(data) {
     res.push( data );
}
// ajax(..)是某個(gè)庫(kù)中提供的某個(gè)Ajax函數(shù) 
ajax( "http://some.url.1", response ); 
ajax( "http://some.url.2", response );

這里的并發(fā)“進(jìn)程”是這兩個(gè)用來處理 Ajax 響應(yīng)的 response() 調(diào)用。它們可能以任意順 序運(yùn)行。

我們假定期望的行為是 res[0] 中放調(diào)用 "http://some.url.1" 的結(jié)果,res[1] 中放調(diào)用 "http://some.url.2" 的結(jié)果。有時(shí)候可能是這樣,但有時(shí)候卻恰好相反,這要視哪個(gè)調(diào) 用先完成而定。

這種不確定性很有可能就是一個(gè)競(jìng)態(tài)條件 bug。

解決辦法

var res = [];
function response(data) {
     if (data.url == "http://some.url.1") {
       res[0] = data;
     }
     else if (data.url == "http://some.url.2") {
       res[1] = data;
     } 
}
// ajax(..)是某個(gè)庫(kù)中提供的某個(gè)Ajax函數(shù) 
ajax( "http://some.url.1", response ); 
ajax( "http://some.url.2", response );

不管哪一個(gè) Ajax 響應(yīng)先返回,我們都要通過查看 data.url(當(dāng)然,假定從服務(wù)器總會(huì)返 回一個(gè)!)判斷應(yīng)該把響應(yīng)數(shù)據(jù)放在 res 數(shù)組中的什么位置上。res[0] 總是包含 "http:// some.url.1" 的結(jié)果,res[1] 總是包含 "http://some.url.2" 的結(jié)果。通過簡(jiǎn)單的協(xié)調(diào),就 避免了競(jìng)態(tài)條件引起的不確定性。

例子2:

var a, b;
   function foo(x) {
     a = x * 2;
     baz(); 
   }
   function bar(y) {
     b = y * 2;
     baz(); 
   }
   function baz() {
     console.log(a + b);
   }
// ajax(..)是某個(gè)庫(kù)中的某個(gè)Ajax函數(shù) 
ajax( "http://some.url.1", foo ); 
ajax( "http://some.url.2", bar );

在這個(gè)例子中,無論 foo() 和 bar() 哪一個(gè)先被觸發(fā),總會(huì)使 baz() 過早運(yùn)行(a 或者 b 仍處 于未定義狀態(tài));但對(duì) baz() 的第二次調(diào)用就沒有問題,因?yàn)檫@時(shí)候 a 和 b 都已經(jīng)可用了。

要解決這個(gè)問題有多種方法。這里給出了一種簡(jiǎn)單方法:

var a, b;
function foo(x) {
     a = x * 2;
     if (a && b) {
       baz();
     } 
}
function bar(y) {
     b = y * 2;
     if (a && b) {
       baz();
     } 
}
function baz() {
     console.log( a + b );
}
// ajax(..)是某個(gè)庫(kù)中的某個(gè)Ajax函數(shù) 
ajax( "http://some.url.1", foo );
ajax( "http://some.url.2", bar );

包裹baz()調(diào)用的條件判斷if (a && b)傳統(tǒng)上稱為門(gate),我們雖然不能確定a和b 到達(dá)的順序,但是會(huì)等到它們兩個(gè)都準(zhǔn)備好再進(jìn)一步打開門(調(diào)用 baz())。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JS模板編譯的實(shí)現(xiàn)詳情

    JS模板編譯的實(shí)現(xiàn)詳情

    這篇文章主要介紹了JS模板編譯的實(shí)現(xiàn)詳情,編譯是一種格式變成另一種格式的過程。編譯會(huì)導(dǎo)致好的結(jié)果,比如書寫簡(jiǎn)單的代碼,編譯出來復(fù)雜的代碼;或者提高代碼的使用性能
    2022-07-07
  • 在JavaScript中使用JSON數(shù)據(jù)

    在JavaScript中使用JSON數(shù)據(jù)

    JSON 是 JavaScript 原生格式,這意味著 在 JavaScript 中處理 JSON 數(shù)據(jù)不需要任何特殊的 API 或工具包,接下來由腳本之家小編給大家介紹在JavaScript中使用JSON數(shù)據(jù)的方法,感興趣的朋友一起學(xué)習(xí)吧
    2016-02-02
  • 由淺到深了解JavaScript類

    由淺到深了解JavaScript類

    由淺到深了解JavaScript類...
    2006-09-09
  • JavaScript調(diào)用瀏覽器打印功能實(shí)例分析

    JavaScript調(diào)用瀏覽器打印功能實(shí)例分析

    這篇文章主要介紹了JavaScript調(diào)用瀏覽器打印功能的方法,實(shí)例分析了針對(duì)各種常用瀏覽器調(diào)用打印功能的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 使用Bootstrap美化按鈕實(shí)例代碼(demo)

    使用Bootstrap美化按鈕實(shí)例代碼(demo)

    這篇文章主要介紹了使用Bootstrap美化按鈕實(shí)例代碼(demo),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • range 標(biāo)準(zhǔn)化之獲取

    range 標(biāo)準(zhǔn)化之獲取

    range 是用戶選擇區(qū)域的唯一表示方法,存在 w3c 的標(biāo)準(zhǔn)化 range ,以及 ie 特有的 textrange 與 controlrange ,相對(duì)于 ie ,w3c 的概念更易于理解,首先簡(jiǎn)要介紹一下 w3c range.
    2011-08-08
  • js停止輸出代碼

    js停止輸出代碼

    方便我們控制js的停止往下執(zhí)行
    2008-07-07
  • 動(dòng)態(tài)規(guī)劃之使用備忘錄來改進(jìn)Javascript函數(shù)

    動(dòng)態(tài)規(guī)劃之使用備忘錄來改進(jìn)Javascript函數(shù)

    這篇文章主要介紹了動(dòng)態(tài)規(guī)劃之使用備忘錄來改進(jìn)Javascript函數(shù),動(dòng)態(tài)規(guī)劃它既是一種數(shù)學(xué)優(yōu)化方法,也是一種計(jì)算機(jī)編程方法,下文相關(guān)資料介紹需要的小伙伴可以參考一下
    2022-04-04
  • 純JavaScript 實(shí)現(xiàn)flappy bird小游戲?qū)嵗a

    純JavaScript 實(shí)現(xiàn)flappy bird小游戲?qū)嵗a

    這篇文章主要介紹了純JavaScript 實(shí)現(xiàn)flappy bird小游戲?qū)嵗a,b本文分七大步驟給大家介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • javascript結(jié)合canvas實(shí)現(xiàn)圖片旋轉(zhuǎn)效果

    javascript結(jié)合canvas實(shí)現(xiàn)圖片旋轉(zhuǎn)效果

    圖片的旋轉(zhuǎn)可以說是一種效果,但是逐漸旋轉(zhuǎn)已經(jīng)不單單是屬于視覺效果那個(gè)范疇,其更具有使用性,功能性。照片有時(shí)候是需要橫過來的拍的,當(dāng)我們預(yù)覽或共享到web上時(shí)需要進(jìn)行旋轉(zhuǎn)。這個(gè)操作在以往可能更多的是交給軟件去完成,然后再將旋轉(zhuǎn)到正常角度的圖片發(fā)布到web上。
    2015-05-05

最新評(píng)論

潞西市| 霸州市| 安徽省| 雅江县| 驻马店市| 扶余县| 潜山县| 泾阳县| 宁河县| 博乐市| 遂昌县| 龙江县| 集安市| 金平| 屯门区| 嘉黎县| 威海市| 珠海市| 东山县| 依兰县| 台安县| 庆城县| 黑水县| 上思县| 江阴市| 车致| 正宁县| 铜鼓县| 兰西县| 沙湾县| 濮阳市| 和政县| 舒城县| 都安| 渝中区| 宜州市| 建昌县| 河源市| 博乐市| 张家口市| 淳安县|