如何用$ .getJSON写异步?

时间:2013-02-24 05:31:11

标签: javascript jquery async.js

我正在做这样的事情

$.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这样的异步库 我如何在这种情况下实现这一点?

2 个答案:

答案 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)
});