Javascript异步执行不按顺序解决方案


Posted in Javascript onApril 30, 2020

案例分析:

比如执行懒加载时候,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 相关文章推荐
对YUI扩展的Gird组件 Part-2
Mar 10 Javascript
zTree插件之单选下拉菜单实例代码
Nov 07 Javascript
通过action传过来的值在option获取进行验证的方法
Nov 14 Javascript
JavaScript实现彩虹文字效果的方法
Apr 16 Javascript
JS插件overlib用法实例详解
Dec 26 Javascript
AngularJS控制器继承自另一控制器
May 09 Javascript
JS使用正则实现去掉字符串左右空格的方法
Dec 27 Javascript
老生常谈Bootstrap媒体对象
Jul 06 Javascript
vue2.0与bootstrap3实现列表分页效果
Nov 28 Javascript
解决Angular4项目部署到服务器上刷新404的问题
Aug 31 Javascript
详解微信小程序-扫一扫 wx.scanCode() 扫码大变身
Apr 30 Javascript
redux.js详解及基本使用
May 24 Javascript
JS判断浏览器类型与操作系统的方法分析
Apr 30 #Javascript
JavaScript自定义超时API代码实例
Apr 30 #Javascript
javascript 模块依赖管理的本质深入详解
Apr 30 #Javascript
JavaScript find()方法及返回数据实例
Apr 30 #Javascript
js this 绑定机制深入详解
Apr 30 #Javascript
JS 图片压缩原理与实现方法详解
Apr 29 #Javascript
详解Vue3 Composition API中的提取和重用逻辑
Apr 29 #Javascript
You might like
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
js实现简单的验证码
2015/12/25 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
javascript json对象小技巧之键名作为变量用法分析
2019/11/11 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
2017/11/15 Python
python+selenium识别验证码并登录的示例代码
2017/12/21 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
python3 enum模块的应用实例详解
2019/08/12 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
老师自我鉴定范文
2013/12/25 职场文书
公司离职证明范本
2014/01/13 职场文书
会计岗位职责模板
2014/03/12 职场文书
学校社会实践活动总结
2014/07/03 职场文书
美术课外活动总结
2014/07/08 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python