Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple Response AJAX request

Is there a way to have one AJAX request with multiple responses?

For example, if make a GET request to the server which will take a long time to calculate, how could I have the server occasionally send back responses which give me some data about the progress?

If so, could somebody post an example, preferably with Jquery and an explanation of the mechanism through which the server can does it?

like image 210
Peter Olson Avatar asked Jun 25 '11 01:06

Peter Olson


2 Answers

You can implement this using 2 ajax calls, one to run the process and a second call to periodically poll the progress:

On the server side:

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

On the client side:

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'); } 
like image 106
The Scrum Meister Avatar answered Oct 11 '22 10:10

The Scrum Meister


Fast answer: No, it isn't possible.

You should send more requests to get more responses

like image 39
genesis Avatar answered Oct 11 '22 10:10

genesis