欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

案例分析:

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

例子1:

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

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

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

這種不確定性很有可能就是一個競態(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(..)是某個庫中提供的某個Ajax函數(shù) 
ajax( "http://some.url.1", response ); 
ajax( "http://some.url.2", response );

不管哪一個 Ajax 響應(yīng)先返回,我們都要通過查看 data.url(當(dāng)然,假定從服務(wù)器總會返 回一個!)判斷應(yīng)該把響應(yīng)數(shù)據(jù)放在 res 數(shù)組中的什么位置上。res[0] 總是包含 "http:// some.url.1" 的結(jié)果,res[1] 總是包含 "http://some.url.2" 的結(jié)果。通過簡單的協(xié)調(diào),就 避免了競態(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(..)是某個庫中的某個Ajax函數(shù) 
ajax( "http://some.url.1", foo ); 
ajax( "http://some.url.2", bar );

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

要解決這個問題有多種方法。這里給出了一種簡單方法:

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(..)是某個庫中的某個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 到達的順序,但是會等到它們兩個都準(zhǔn)備好再進一步打開門(調(diào)用 baz())。

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

相關(guān)文章

  • 如何只用echarts做個仿3d地圖功能

    如何只用echarts做個仿3d地圖功能

    由于業(yè)務(wù)需求,需要繪制3d地圖,所以下面這篇文章主要給大家介紹了關(guān)于如何只用echarts做個仿3d地圖功能的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 七行JSON代碼把你的網(wǎng)站變成移動應(yīng)用過程詳解

    七行JSON代碼把你的網(wǎng)站變成移動應(yīng)用過程詳解

    這篇文章主要介紹了七行JSON代碼把你的網(wǎng)站變成移動應(yīng)用過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值
    2019-07-07
  • JS使用AudioContext實現(xiàn)音頻流實時播放

    JS使用AudioContext實現(xiàn)音頻流實時播放

    這篇文章主要為大家詳細(xì)介紹了JavaScript如何使用AudioContext實現(xiàn)音頻流實時播放功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • JavaScript中的scrollTop詳解(滾動到頂部)

    JavaScript中的scrollTop詳解(滾動到頂部)

    scrollTop是JavaScript中一個非常有用且重要的方法,它用于獲取或設(shè)置元素的垂直滾動條位置,這篇文章主要給大家介紹了關(guān)于JavaScript中scrollTop詳解(滾動到頂部)的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • 別了 JavaScript中的isXX系列

    別了 JavaScript中的isXX系列

    我們很容易被漂亮的代碼吸引,也不知不覺的在自己的代碼庫中加入這些。卻沒有冷靜的想過它們的優(yōu)劣。這不,我就收集了一系列形如 是否為……? 的判斷的boolean函數(shù)
    2012-08-08
  • ?javascript數(shù)組中的findIndex方法?

    ?javascript數(shù)組中的findIndex方法?

    這篇文章主要介紹了javascript數(shù)組中的findIndex方法,findIndex()?方法返回傳入一個測試條件函數(shù)符合條件的數(shù)組第一個元素位置,下面更多相關(guān)資料,需要的小伙伴可以參考一下
    2022-03-03
  • javascrit中undefined和null的區(qū)別詳解

    javascrit中undefined和null的區(qū)別詳解

    這篇文章主要介紹了javascrit中undefined和null的區(qū)別詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • javascript函數(shù)式編程程序員的工具集

    javascript函數(shù)式編程程序員的工具集

    函數(shù)式編程語言一向被認(rèn)為是比其它編程語言更高深的語言。一是因為函數(shù)式編程語言的語法很另類,比如Lisp語言,二是因為函數(shù)式編程語言都很古老,比如Schema語言。在如今面向?qū)ο笳Z言大行其道的時代,函數(shù)式編程語言有其特殊的優(yōu)勢
    2015-10-10
  • JavaScript動態(tài)提示輸入框輸入字?jǐn)?shù)的方法

    JavaScript動態(tài)提示輸入框輸入字?jǐn)?shù)的方法

    這篇文章主要介紹了JavaScript動態(tài)提示輸入框輸入字?jǐn)?shù)的方法,實例分析了javascript針對頁面元素的動態(tài)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • JS的空值合并運算符(??)的使用

    JS的空值合并運算符(??)的使用

    空值合并運算符是一個邏輯運算符,當(dāng)左側(cè)的操作數(shù)為null或undefined時,會返回右側(cè)操作數(shù),否則返回左側(cè)操作數(shù),本文就來詳細(xì)的介紹一下如何使用
    2023-12-12

最新評論