我正在做这样的事情
$.getJSON(url1, function(response1){
if(response1.status == 'success'){
$.getJSON(url2, function(response2){
if(response2.status == 'success') {
$.getJSON(url3, function(response3){
if(response3.status == 'success') {
//final code here
}
});
}
});
}
});
我听说过像https://github.com/caolan/async#series这样的异步库 我如何在这种情况下实现这一点?
答案 0 :(得分:1)
您的代码已经在使用异步处理模型。因此,您不必使用任何其他库来使其异步。
$.getJson是一种实用程序方法,它使用$.ajax从服务器发送和接收数据。 $ .ajax使用XmlHttpRequest发送/接收使用异步处理模型构建的数据。
如果你想要测试异步性质你可以在$ .getJson()调用之后添加console.log('post post')和在if之前添加console.log('after callback'之后)(response2.status = ='成功')陈述。
如果您在发送请求后检查控制台,则会发现after post
之前出现after callback
,这意味着脚本执行仍在继续,而不等待服务器的响应。
答案 1 :(得分:1)
你真的想要进行同步调用(阻止浏览器直到它完成),或者只是在另一个完成之后有一个“更清洁”的方式启动一个getJSON
(没有将它嵌套在回调中)?正如其他人已经指出的那样,ajax调用已经彼此同步。
对于第一个选项,请查看更一般的$.ajax
(您可以在参数中将async
设置为false
。对于第二个,您可以创建一个递归效用函数:
function chain(list,index,callback,errorCallback) {
if ( index == list.length )
return callback();
$.getJSON(list[index])
.done(function() {
chain(list,index+1,callback);
})
.fail(errorCallback);
}
chain([url1, url2, url3],0,function() {
//final code here
},function() {
//error handling here (in any of the calls)
});