今天碰到一个面试问题,就是如果页面中有两个异步ajax的操作,因为不确定这两个异步操作的执行顺序,怎么在这两个操作都执行完再执行一个新的操作,最好的方法是什么?
我当时回答了方法一:嵌套两个ajax,在第二个ajax的返回函数中执行新的操作。面试官回复:这种方法太矬了。
于是想了下回答方法二:通过定时器setTimeout监听局部变量,确保两个异步操作执行完了再执行新操作。 面试官回复:这种方式性能不好,能不能想到一个简单又更合理的方法。
当时思考未果
所以把这个问题放上来寻求最好的方法是什么?欢迎讨论指点
1.Promise 包装异步ajax操作,
2.定义async 函数,
3.用await等待promise数据异步获取完成
这一种方法简洁高效,下面请看我专门给你写的示例代码
我懒得用ajax获取数据了,就用settimeout这个函数模拟获取数据吧,这个函数是异步的,原理效果一样。
http://api.jquery.com/jQuery....
目前浏览器环境中开箱即用的原生方法是 Promise.all。
以调用我的地图库 Sinomap Demo 为例,这个页面中为了加载一张地图,需要多个同时发起但不能确保返回顺序的请求:
中国地形数据
各省份数值 JSON 数据
多种图表叠加时多种图表存在多种 JSON 数据需通过不同数据接口返回……
解决方法直接在未打包的
http://sinomap.ewind.us/demo/demo.js
中,示例:这样通过 Promise 不仅实现了回调逻辑的解耦,还实现了基础的异步流程控制。
刚刚看到jquery 的 when 方法,所以给你重写了一个,不一定有jquery的那么好,但至少能实现效果了,可以在控制台直接输入下述代码试试,我勒个去,写了我整整半小时。。
问下能不能用jQ,能用的话直接:
顺带给个$.when的文档参考
我觉得是Promise的方法 all还是什么的
你的问题是有三件事 a,b,c。c要在a和b结束之后再执行。
有很多方法: 比如你说的嵌套法 还有暴力监听法
这个问题我曾经考虑过,以下是我的解答。
异步发射器
用数组保存如何执行异步操作
注意里面的函数都有个参数 commit ,它是一个函数 用来回传值。 当ajax成功的时候 把返回值回传进去就好
编写发射器
processors 是 todos 这样的数据。 cb 是最终回调。
并发他们
执行异步发射器 并提供
最终回调
Link
https://eczn.coding.me/blog/%...
可以定义个变量a=0,ajax请求成功后在回调里设置a++;
然后在两个回调中均判断下a==2 执行操作函数
设置两个flag,然后两个ajax调用同一个回调,在这个回调中判断两个flag都为true才执行后续操作。
把ajax写在另一个ajax里面再在回调那里执行