电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Javascript異步執行不按順序解決方案

瀏覽:139日期:2023-10-31 16:55:38

案例分析:

比如執行懶加載時候,onscroll 事件觸發多次事件時候會調用多次 ajax 回調事件,由于每個事件返回先后次序并不能保證和觸發前一致,所以在數據響應返回后所添加的數據順序就很在 push 到數組上順序不一致。

例子1:

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

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

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

這種不確定性很有可能就是一個競態條件 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函數 ajax( 'http://some.url.1', response ); ajax( 'http://some.url.2', response );

不管哪一個 Ajax 響應先返回,我們都要通過查看 data.url(當然,假定從服務器總會返 回一個!)判斷應該把響應數據放在 res 數組中的什么位置上。res[0] 總是包含 'http:// some.url.1' 的結果,res[1] 總是包含 'http://some.url.2' 的結果。通過簡單的協調,就 避免了競態條件引起的不確定性。

例子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函數 ajax( 'http://some.url.1', foo ); ajax( 'http://some.url.2', bar );

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

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

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函數 ajax( 'http://some.url.1', foo );ajax( 'http://some.url.2', bar );

包裹baz()調用的條件判斷if (a && b)傳統上稱為門(gate),我們雖然不能確定a和b 到達的順序,但是會等到它們兩個都準備好再進一步打開門(調用 baz())。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 污水提升器,污水提升泵,地下室排水,增压泵,雨水泵,智能供排水控制器-上海智流泵业有限公司 | 【连江县榕彩涂料有限公司】官方网站 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 超声波清洗机-超声波清洗设备定制生产厂家 - 深圳市冠博科技实业有限公司 | 太空舱_民宿太空舱厂家_移动房屋太空舱价格-豪品建筑 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 | 泰安办公家具-泰安派格办公用品有限公司 | 创客匠人-让IP变现不走弯路 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | 丹佛斯压力传感器,WISE温度传感器,WISE压力开关,丹佛斯温度开关-上海力笙工业设备有限公司 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 留学生辅导网-在线课程论文辅导-留学生挂科申诉机构 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 伸缩节_伸缩器_传力接头_伸缩接头_巩义市联通管道厂 | 郑州爱婴幼师学校_专业幼师培训_托育师培训_幼儿教育培训学校 | 整合营销推广|营销网络推广公司|石家庄网站优化推广公司|智营销 好物生环保网、环保论坛 - 环保人的学习交流平台 | 鑫达滑石-辽宁鑫达滑石集团 | 飞飞影视_热门电影在线观看_影视大全 | 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 全自动真空上料机_粉末真空上料机_气动真空上料机-南京奥威环保科技设备有限公司 | 集菌仪_智能集菌仪_全封闭集菌仪_无菌检查集菌仪厂家-那艾 | 铝板冲孔网,不锈钢冲孔网,圆孔冲孔网板,鳄鱼嘴-鱼眼防滑板,盾构走道板-江拓数控冲孔网厂-河北江拓丝网有限公司 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 对照品_中药对照品_标准品_对照药材_「格利普」高纯中药标准品厂家-成都格利普生物科技有限公司 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 葡萄酒灌装机-食用油灌装机-液体肥灌装设备厂家_青州惠联灌装机械 | 小型数控车床-数控车床厂家-双头数控车床 | 执业药师报名时间,报考条件,考试时间-首页入口 | 煤棒机_增碳剂颗粒机_活性炭颗粒机_木炭粉成型机-巩义市老城振华机械厂 | 艺术涂料|木纹漆施工|稻草漆厂家|马来漆|石桦奴|水泥漆|选加河南天工涂料 | 齿辊分级破碎机,高低压压球机,立式双动力磨粉机-郑州长城冶金设备有限公司 | 深圳装修_店面装修设计_餐厅设计_装修全包价格-尚泰装饰设计 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 泰州物流公司_泰州货运公司_泰州物流专线-东鑫物流公司 |