如何同时发起两个ajax请求不互相影响?

再页面上写了一个ajax函数fun(query),只需要传入查询字符串就可以发起请求,其它的url等等条件都是一样的。
那么问题来了,这时候页面上有两个地方需要发起ajax请求,拿到数据渲染页面,于是调用这个函数发起请求:

  • fun(query1);

  • fun(query2);

那么这时这两个ajax可不可以可以分辨得出来那个返回的数据时自己所发起的请求返回的?因为ajax时异步请求嘛,哪个请求返回的数据也并不一定?如果真的有混乱对的可能,那么一般的解决方案有哪些?

补充:我想实现的是页面加载的时候有两个地方自动从服务器获取数据渲染页面,所以这两个请求页面加载的时候就会自动触发了,请求1和2的数据哪个先返回是不确定的,有可能请求1的数据先返回,也有可能请求2的数据先返回。我就怕请求1的回调函数获取到了请求2的数据,请求2获取了请求1的数据,因为我也没看到程序做了什么事情来确定得到的数据就是自己所发起的请求所返回的

阅读 23.8k
12 个回答

为什么要去分辨?按照常理,不同的请求会被绑定到不同的行为中,即使他们调用的是同一函数.比如有个按钮A叫查询姓名,有个按钮B叫查询年龄,你封装了一个函数,只要传参数就能对应去获取数据.那么你在A绑定点击事件的时候传的回调函数和在B绑定点击事件传的回调肯定是不一样的啊。


function fun(query){}

$('#queryName').on('click', fun({queryCondition: {xx: ['name']}, callback: function(){逻辑A}}))

$('#queryAge').on('click', fun({queryCondition: {xx: ['age']}, callback: function(){逻辑B}}))

或者你fun里面返回一个jqxhr对象也行,那么你就可以写成
$('#queryName').on('click', fun({queryCondition: {xx: ['name']}}))
.done(function(){逻辑A});

$('#queryAge').on('click', fun({queryCondition: {xx: ['age']}}))
.done(function(){逻辑B}});
//以`jQuery`的`ajax`举例
$.get("getSomeData1.do",function(data,status){  
    handle1(data);  
});

$.get("getSomeData2.do",function(data,status){  
    handle2(data);  
});

题主自己想得复杂了,其实很简单。
虽然它们的返回时机是不可预知的,但是它们都有自己的回调函数,handle1拿到的必然是getSomeData1.do的数据,,handle2拿到的必然是getSomeData2.do的数据。

每个 ajax 请求都是独立的,通过回调(或 Promise)的方式来通知调用结束并返回结果。所以,如果你两个 ajax 调用的回调处理是两个函数,就不存在你说的问题。

如果你定义一个函数用于两个 ajax 回调,那你说的问题是存在的,但是也可以很容易解决——在传入回调函数的时候用个匿名函数把原来的处理函数包一层就好。比如(用 jQuery 了,方便)

function commonCallback(data) {
    // do something with data
}

$.ajax(url1).done(function(data) {
    console.log("here is ajax1 callback");
    commonCallback(data);
})

$.ajax(url2).done(function(data) {
    console.log("here is ajax2 callback");
    commonCallback(data);
})

如果你需要等两个 ajax 都操作完成再进行下一步操作,可以用 $.when 来进行并行处理

var ajax1 = $.ajax(url1);
var ajax2 = $.ajax(url2);
$.when(ajax1, ajax2).done(function(data1, data2) {
    // do something with data1 & data2
})

异步只是返回的顺序无法控制,但是回哪是明确的,不会走错门的,

难道success之后调用的function也是同一个?
难道同一个function内部还要判断参数来源?
难道判断完了还要执行不同的函数体?
为什么不一开始就写不同的success回调?
柯里化如果不能解决那就不能解决了

请求 1 的回调函数中拿到的数据必然是请求 1 的数据,不用分辨。

只能在接口上做调整,再加一个传入参数之类的,然后让接口返回个标识值。

延迟请求吧!

让后台对传出参数做判断 传入和传出想对应

两个请求为什么会受影响

这个需要区分吗?请求1 可以 拿到 请求2 的数据? 不太懂提问者的意思

这个有解决的,jquery的 when() 就可以,你去搜索下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏