现有有个需求,页面有几个按钮,点击任何一个按钮,都会发送一次ajax,如果点击了2个按钮,要把这两个ajax返回过来的数据求交集,请问除了使用同步ajax的方法外有没有别的办法保证求交集一定在ajax返回数据之后调用?
代码类似与这样:
// 在getData中,发送ajax请求
var list1 = getData();
var list2 = getData();
// intersect 是自己写的求交集的方法 ,inter 是list1和list2的交集
var inter = intersect(list1,list2)
除了jquery的defrred之外,使用原生来做,请提供一个思路
可以采用数字来标记吧。就数字标记发送的ajax请求数,ajax返回结果时数字-1,等数字为0时在求交集。
=====
@杨川宝 的答案很好,采用promise来做。
得用 $.when 详情看这里
http://.com/q/1010000004169937?utm_source=APP&utm_medium=iOS&utm_campaign=socialShare
设置两个全局变量定义为false,ajax请求后就设置成true,然后进行轮训,
全局变量为true了就执行你的函数,累死这样,不过有点笨而已,也不适为一种方法吧。
如下
var flag1 = flag2 = false;
var timer = null;
var list1 = getData(function(){
//ajax....
success: function(){
flag1 = true;
}
});
var list2 = getData(function(){
//ajax....
success: function(){
flag2 = true;
}
});
// intersect 是自己写的求交集的方法 ,inter 是list1和list2的交集
timer = setInterval(function(){
if(flag1 === true && flag2 === true){
var inter = intersect(list1,list2);
clearInterval(timer);
timer = null;
}else{
// 这里做个计数器,多少秒或者轮训多少次之后也关闭定时器,免得进入死循环
}
},100)
var cache = [];
// 在getData中,发送ajax请求
getData(test);//get list1
getData(test);//get list2
function test(data){
cache.push(data);
if(cache.length === 2){
var inter = intersect(cache[0], cache[1])
}
}