有没有办法让一个AJAX请求有多个响应?多个响应AJAX请求
例如,如果向服务器发出一个需要很长时间计算的GET请求,我怎么才能让服务器偶尔发回响应,这些响应给我一些关于进度的数据?
如果是这样,有人可以发布一个例子,最好用JQuery和解释服务器可以做到这一点的机制?
有没有办法让一个AJAX请求有多个响应?多个响应AJAX请求
例如,如果向服务器发出一个需要很长时间计算的GET请求,我怎么才能让服务器偶尔发回响应,这些响应给我一些关于进度的数据?
如果是这样,有人可以发布一个例子,最好用JQuery和解释服务器可以做到这一点的机制?
您可以实现这一点使用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');
}
聪明,我喜欢它!我还没有使用会话来存储进度数据。 –
@ peter-of-the-corn还有其他方法可以做到这一点。看看[Comet](http://en.wikipedia.org/wiki/Comet_(programming))。如果您确实使用此解决方案,请确保验证'id'参数,以便恶意用户无法覆盖整个会话。 –
快速回答:不,这是不可能的。
你应该把更多的请求,以获得更多的响应
你很可能需要从服务器端编码的帮助,因为长得像你需要反向AJAX或什么也被称为彗星推。我不知道你在服务器端使用哪种语言,但基本思想是只要浏览器允许使用无限循环(在服务器端)并在连接处于活动状态时推送数据,则延迟http响应。
您可能想要检查了这一点: http://code.google.com/p/google-web-toolkit-incubator/wiki/ServerPushFAQ
看看xajax它可以发回多个响应,并且可以将它们重定向到某些区域。在这方面,xajax比jQuery好得多。我可以提出一个请求,服务器可以编写一个包含多个响应的响应,包括HTML,JavaScript,调用等等。你甚至可以说把它放在那里,并且附加选项如替换,替换等非常酷。 jQuery应该这样做,然后我可以一劳永逸地切换到jQuery ......这是唯一让我无法切换的东西。
XAJAX仅适用于PHP,并且仅用XML传输数据。 –
一个Ajax请求----------->你得到一个响应。
你实际上可以做的是。
检查响应数据 和 根据获取的数据做不同的操作。
您使用的是哪种服务器端语言/框架? –
这没关系,因为这是不可能的 – genesis
@The Scrum Meister C#/ ASP.NET –