本文主要介绍Ajax在for循环中,请求只返回一次结果的问题解决。
一、async决定了同步与异步请求
1.1 Ajax默认是异步请求,会继续执行Ajax后面的脚本,直到服务器端返回数据后,触发Ajax里的success方法,这时候执行的是多个线程,其根源是async属性默认是 true。 1.2 async 设置为 false,则所有的请求均为同步请求,在没有返回值之前,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。
二、枚举代码
2.1 app.js封装ajax请求
ajax: function(option) {
ajaxCount++;
var _ajaxCount = ajaxCount,
return $.ajax({
type: option.type || "POST",
url: app.getItem(app.localKey.url) + option.url, // 请求的url
timeout: option.timeout || app.timeout, // 超时
async: option.async || false, // 同步异步控制
dataType: "json", // 参数类型
data: option.data, // 参数
success: function(r) { // 返回值
option.success && option.success(r);
},
error: option.error
});
},
2.2 当async为true
for(var i=0;i<obj.length;i++){
app.ajax({
url: url, // 请求url
async: true,
success: function(r) {
if (r && r.errcode == 0) {
var ddid = r.value.ddid;
vm.chatList.push(ddid);
} else {
$.toast(r.errmsg);
}
}
});
}
上述的for循环案例,vm.chatList只会push最后一个返回值。
2.3 当async为false
for(var i=0;i<obj.length;i++){
app.ajax({
url: url, // 请求url
async: false,
success: function(r) {
if (r && r.errcode == 0) {
var ddid = r.value.ddid;
vm.chatList.push(ddid);
} else {
$.toast(r.errmsg);
}
}
});
}
上述的for循环案例,vm.chatList通过push新增的数组由obj的长度决定。
吴维炜
HTTPS
CSS
ECMAScript 6
Q: 有多少程序员会去更换灯泡?A: 没有,那是硬件问题。Q:为什么程序员总是把圣诞节与万圣夜搞混?A:因为 DEC 25 = OCT 31