0

我正在做这样的事情

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

4

2 回答 2

1

您的代码已经在使用异步处理模型。因此,您不必使用任何其他库来使其异步。

$.getJson是一种实用方法,它使用$.ajax从服务器发送和接收数据。$.ajax 使用 XmlHttpRequest 发送/接收使用异步处理模型构建的数据。

要测试异步性质,如果您愿意,您可以在 $.getJson() 调用之后添加 console.log('after post') 并在 if(response2.status == 'success 之前添加 console.log('after callback') ') 陈述。

如果您在发送请求后检查您的控制台,您会发现after post之前出现after callback的这意味着脚本继续执行而无需等待服务器的响应。

于 2013-02-24T05:50:29.060 回答
1

你真的想进行同步调用(阻止浏览器直到它完成)还是只是有一种“更干净”的方式getJSON在另一个完成后启动一个(而不将它嵌套在回调中)?正如其他人已经指出的那样,ajax 调用已经相互同步。

对于第一个选项,请查看更通用的$.ajax(您可以在参数中设置asyncfalse)。对于第二个,您可以只创建一个递归效用函数:

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)
});
于 2013-02-24T05:52:04.047 回答