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 相关文章推荐
js form action动态修改方法
Nov 04 Javascript
一段实现页面上的图片延时加载的js代码
Feb 11 Javascript
jquery json 实例代码
Dec 02 Javascript
js前台分页显示后端JAVA数据响应
Mar 18 Javascript
JavaScript自定义日期格式化函数详细解析
Jan 14 Javascript
jQuery extend()详解及简单实例
May 06 jQuery
Vue-cli proxyTable 解决开发环境的跨域问题详解
May 18 Javascript
JavaScript实现的搜索及高亮显示功能示例
Aug 14 Javascript
element-ui 中的table的列隐藏问题解决
Aug 24 Javascript
vue-quill-editor富文本编辑器简单使用方法
Sep 21 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
Nov 08 Javascript
基于iview的router常用控制方式
May 30 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中的traits简单使用实例
2015/05/13 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2021/03/09 PHP
javascript函数库-集合框架
2007/04/27 Javascript
WEB 浏览器兼容 推荐收藏
2010/05/14 Javascript
javascript时区函数介绍
2012/09/14 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
原生js实现数字字母混合验证码的简单实例
2015/12/10 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
2016/03/22 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
python调用Delphi写的Dll代码示例
2017/12/05 Python
python实现一个简单的并查集的示例代码
2018/03/19 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
为什么要做架构设计
2015/07/08 面试题
制定岗位职责的原则
2013/11/08 职场文书
食品销售计划书
2014/04/26 职场文书
局火灾防控工作方案
2014/05/25 职场文书
出差报告怎么写
2014/11/06 职场文书
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript
用Python生成会跳舞的美女
2022/01/18 Python
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python