有没有办法让一个AJAX请求有多个响应?
例如,如果向服务器发出GET请求需要很长时间才能计算出来,我怎么能让服务器偶尔发回回复给我一些关于进度的数据?
如果是这样,有人可以发布一个例子,最好是使用Jquery并解释服务器可以通过它实现的机制吗?
答案 0 :(得分:22)
您可以使用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');
}
答案 1 :(得分:5)
快速回答:不,这是不可能的。
您应该发送更多请求以获得更多回复
答案 2 :(得分:1)
您很可能需要服务器端编码的帮助,因为看起来您需要反向ajax或者也称为comet push。我不知道你在服务器端使用哪种语言,但基本的想法是延迟http响应,只要浏览器允许使用无限循环(在服务器端)并在连接活动时推送数据
你可能想看看这个: http://code.google.com/p/google-web-toolkit-incubator/wiki/ServerPushFAQ
答案 3 :(得分:1)
看看xajax它可以发回多个响应,并且可以将它们重定向到某些区域。在这方面,xajax比jQuery好得多。我可以发出一个请求,服务器可以编写一个响应,其中包含HTML,JavaScript,调用等多个响应。你甚至可以说把它放在那里,那里有附加,替换等选项非常酷。 jQuery应该这样做,然后我可以一劳永逸地切换到jQuery ...这是唯一阻止我切换的东西。
答案 4 :(得分:0)
一个Ajax请求-----------&gt;你得到一个回复。
你实际可以做的是。
检查响应数据 和 根据提取的数据执行不同的操作。