2013-02-15 84 views
1

我的脚本需要处理几个Ajax请求。这里是一个简化的版本:如何处理几个Ajax请求?

function request(variable){ 
    $.ajax({ 
     // call config 
    }).done(function(data){ 
     // treatment of returned data 
     // returning TRUE (ok) or FALSE (errors) 
    }).fail(function(e){ 
     // generating error message 
    }); 
} 

我需要多次调用:

request(variableA); 
request(variableB); 
request(variableC); 

请求是同时进行的,工作好,但是当过程结束后,我不知道。我无法显示返回的值。

有些讨论建议使用when()。

$.when(request(variableA), request(variableB), request(variableC)) 
    .done(function(resultA, resultB, resultC) { 
     alert("Finished!"); 
     //results available 
    }); 

使用此代码,警报似乎在过程,而不是等待完成的一开始就进行...

什么是我最好的选择?

回答

4

变化request返回承诺

function request(variable){ 
    return $.ajax({ 
     // call config 
    }).done(function(data){ 
     // treatment of returned data 
     // returning TRUE (ok) or FALSE (errors) 
    }).fail(function(e){ 
     // generating error message 
    }); 
} 
+1

只是澄清,这样做会使你的代码使用'$ .when'正常工作:) – 2013-02-16 03:54:08

+0

感谢您的澄清;我一开始并没有明白... – Yako 2013-02-16 09:40:57

2

这些要求()调用将立即返回反正,因为他们是异步(因此在AJAX的A)。要将请求链接在一起,只有在完成时执行某些操作,您必须让单个ajax调用的成功处理程序递增计数器,然后只在计数器达到某个点时调用“继续执行”代码。例如

var alert_counter = 0; 
function request('blahblah', alert_when_reached) { 
$.ajax({ 
    success: function() { 
     alert_counter++; 
     if(alert_when_reached >= alert_counter) { 
      proceed_onwards(); 
     } 
    }); 

不是说这样会工作,但应该给你的想法。如果您需要调用3个并行请求,则将3传递给每个请求,并且当第三个结果最终进入时,成功处理程序的特定实例将调用可让您的代码继续前进的任何函数。

一些小的增强将是为成功处理程序定义闭包并将其传递到request()函数,因此您没有硬编码的“继续”函数调用,但这超出了此范围回答。

+0

谢谢你的接吻。事实上,我正在转向解决方案,因为我无法理解延期对象,并且您的解决方案在此视图中非常有效。不过,我更喜欢使用穆萨的选择;它更轻,更适合jQuery。 – Yako 2013-02-16 09:40:32