您的位置:首页 > 其它

Ajax异步加载问题

2015-10-18 20:11 267 查看
因为ajax是异步加载数据的,所以有时候在一个ajax中调用另一个ajax方法时,需要考虑两者不同步的问题。比如下面这个例子:

//加载用户
$.ajax({
url : 'user/findUserById',
type : 'POST',
data : {userId:'${param.uid}'},
success:function(data){
var users = [{user:data,role:'',certificate:''}];
users[0].role=rolesData(data);
certificatesData(data,users);
//vm.users(users);
}
});

//处理证书信息
function certificatesData(user,users){
$.ajax({
url : 'certificate/getAllCertificate',
type : 'post',
success:function(data){
var arr = eval('('+data+')');
for(var i=0;i<arr.length;i++) {
if(user.certificate_id == arr[i].id) {
users[0].certificate =  arr[i].name;
}
}
vm.users(users);
}
});
}


这里用的是knockout.js来做的数据回显。vm是viewModel,在里面定义了一个users监控数组。加载用户的ajax用来加载用户的数据,里面定义的users数组是用来填充ko里的users监控数组的。certificatesData函数先加载出所有的证书,然后找出用户拥有的证书名称,并把名称赋给users的certificate属性。将这些数据都绑定到ko里面后,用ko在form表单中进行数据回显。

vm.users(users);
用来绑定数据,一开始是在加载用户的ajax的success函数中执行的。但这样做在表单中是显示不出证书的数据的。因为两个ajax是异步执行的,ko在表单回显结束后,certificatesData函数还没有加载完证书数据,所以ko中是没有证书 的数据的。

解决办法是,把
vm.users(users);
这一步放在certificatesData函数的success方法中执行,这样才能保证证书数据能够放到viewModel后再回显。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: