2013-02-24 37 views
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 我如何在这种情况下实现这一点?

+1

您不执行该操作!你这样做,如果你希望它看起来更干净,你使用延期和承诺做同样的事情。 – adeneo 2013-02-24 05:43:48

+0

你拥有的代码已经是异步的,如果你想要一个更干净的代码,如@adeneo建议你可以使用不同的/ promise的API。为了测试异步性质,如果你愿意,你可以在''.getJson()'调用和'console.log('回调后')之后添加'console.log('post''后面''''if' response2.status =='success')'语句 – 2013-02-24 05:48:22

+0

要使用上面建议的jQuery Deferreds,请查看http://api.jquery.com/jQuery.when/ – dcro 2013-02-24 05:54:15

回答

1

您的代码已使用异步处理模型。所以你不必使用任何其他库来使其异步。

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

要测试异步性质,如果你想要的话,你可以在if(response2.status)之前在$ .getJson()调用和console.log('回调后')之后添加一个console.log('after post' =='成功')声明。

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

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