有的时候同一个页面被可能同时产生多个ajax请求,为了用户体验,最好是发送并行请求,这就产生了并发问题,应该如何处理?
这种方法是最简单的了,就是在一个请求执行完后在执行另一个请求。代码如下:
functionasync1() {
//do sth...
async2();
}
functionasync2() {
//do sth...
}
async1();
var url1,url2;
$.ajax({
url: url1,
async: false
});
$.ajax({
url: url2,
async: false
});
很显然,这种方法会需要比较长的等待时间,用户体验不是很好。
就是使用一个标志位标记请求是否已经完成
这种方法会影响性能,尽量少用:
var cnt =0;
functionasync1() {
//do sth...
cnt++;
}
function async2() {
//do sth...
cnt++;
}
async1();
async2();
var interval = setInterval(function(){
if (2 === cnt) {
console.log('已执行完成');
clearInterval(interval)
}
}, 0);
var cnt = 0;
function async1() {
//do sth...
callback();
}
function async2() {
//do sth...
callback();
}
function callback() {
cnt++;
if (2 == cnt)
console.log('都已执行完毕');
}
async1();
async2();
若使用第三方框架实现,则要看第三方的相关文档:
var d1 =$.Deferred();
var d2 =$.Deferred();
functionasync1() {
d1.resolve("Fish");
}
functionasync2() {
d2.resolve("Pizza");
}
async1();
async2();
$.when(d1,d2).done(function(v1, v2) {
console.log(v1 + v2 + '已完成');
});
//下面是关于同时发起多个请求时的处理
axios.all([get1(),get2()])
.then(axios.spread(function(res1,res2) {
// 只有两个请求都完成才会成功,否则会被catch捕获
}));
还有很多框架都可以,比如Angular的$wacth等等
使用ES6中的promise、asyn、await等应该都可以实现,由于本人尚未使用过,暂时不讲,到时候再补充。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
网络异常,请检查网络