Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
202 views
in Technique[技术] by (71.8m points)

javascript - 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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...