2011-06-25 252 views
27

有没有办法让一个AJAX请求有多个响应?多个响应AJAX请求

例如,如果向服务器发出一个需要很长时间计算的GET请求,我怎么才能让服务器偶尔发回响应,这些响应给我一些关于进度的数据?

如果是这样,有人可以发布一个例子,最好用JQuery和解释服务器可以做到这一点的机制?

+0

您使用的是哪种服务器端语言/框架? –

+3

这没关系,因为这是不可能的 – genesis

+0

@The Scrum Meister C#/ ASP.NET –

回答

20

您可以实现这一点使用2个AJAX调用,一个运行过程和第二个电话定期轮询进度:

在服务器端:

public class ProgressInfo 
{ 
    public int Percent {get;set;} 
    public bool Done {get;set;} 
} 

public JsonResult DoCalculation(string id) 
{ 
    ProgressInfo progress = new ProgressInfo(); 
    if(!string.IsNullOrEmpty(id)) 
    { 
     Session[id] = progress; 
    } 

    //periodicly update progress 
    progress.Percent++; 
} 

public JsonResult GetProgress(string id) 
{ 
    ProgressInfo progress; 
    if(string.IsNullOrEmpty(id) 
     || (progress = Session[id] as ProgressInfo) == null) 
    { 
     return Json(new { 
      success = false 
     }); 
    } 
    if(progress.done) 
    { 
     Session.Remove(id); 
    } 
    return Json(new { 
     success = true, 
     done = progress.done, 
     percent = progress.Percent 
    }); 
} 

在客户端:

var progressID = Math.random(); 

function doCalculation() { 
    $.post('<%=Url.Action("DoCalcluation")%>/' + progressID); 
    setTimeout(pollProgress, 1000); 
} 

function pollProgress() { 
    $.post('<%=Url.Action("GetProgress")%>/' + progressID, function(response){ 
     if(!response.success) { 
      alert('Cannot find progress'); 
      return; 
     } 
      if(response.done) { 
       alert('Done!'); 
      } else { 
      alert('Progress at ' + response.precent + '%'); 
      setTimeout(pollProgress, 1000 /*1 second*/); 
      } 
    }, 'json'); 
} 
+0

聪明,我喜欢它!我还没有使用会话来存储进度数据。 –

+0

@ peter-of-the-corn还有其他方法可以做到这一点。看看[Comet](http://en.wikipedia.org/wiki/Comet_(programming))。如果您确实使用此解决方案,请确保验证'id'参数,以便恶意用户无法覆盖整个会话。 –

5

快速回答:不,这是不可能的。

你应该把更多的请求,以获得更多的响应

+0

但是,如果我发送另一个请求,代码将不得不在一开始重新启动。 :( –

+0

重新启动?这是什么意思? – genesis

+1

重新启动意味着重新开始或重新执行。 –

1

你很可能需要从服务器端编码的帮助,因为长得像你需要反向AJAX或什么也被称为彗星推。我不知道你在服务器端使用哪种语言,但基本思想是只要浏览器允许使用无限循环(在服务器端)并在连接处于活动状态时推送数据,则延迟http响应。

您可能想要检查了这一点: http://code.google.com/p/google-web-toolkit-incubator/wiki/ServerPushFAQ

+0

是否意味着在脚本之前输出缓冲区数据结束?不错的想法,但非常复杂,并要求罚款的Apache/PHP配置 – genesis

+0

是的,如果你为自己的处理程序编写代码,但是对于大规模的WebSync产品来处理服务器推送,它会变得复杂。 – vlscanner

1

看看xajax它可以发回多个响应,并且可以将它们重定向到某些区域。在这方面,xajax比jQuery好得多。我可以提出一个请求,服务器可以编写一个包含多个响应的响应,包括HTML,JavaScript,调用等等。你甚至可以说把它放在那里,并且附加选项如替换,替换等非常酷。 jQuery应该这样做,然后我可以一劳永逸地切换到jQuery ......这是唯一让我无法切换的东西。

+0

XAJAX仅适用于PHP,并且仅用XML传输数据。 –

0

一个Ajax请求----------->你得到一个响应。

你实际上可以做的是。

检查响应数据 和 根据获取的数据做不同的操作。