在ajax中的异步请求期间更新变量

时间:2018-03-23 17:57:22

标签: c# ajax asp.net-mvc

CODE:

我的流程需要很长时间才能完成。我们称之为LongProcess。我想在客户端上经常轮询以获取该进程的Status。我的最终目标是使用Status中的值来更新进度条。

这是来自Controller的基本设置:

    // get the current status
    public JsonResult GetStatus()
    {
        return new JsonResult(Status);
    }

    public void SetStatus(int i)
    {
        Status = i;
    }

    // runs for 20 seconds, updates status while it runs
    public JsonResult LongProcess()
    {
        for(int i = 0; i < 10; i++)
        {
            Thread.Sleep(2000);
            SetStatus(i);
        }

        return new JsonResult("Done");
    }

在视图中,我使用ajax向LongProcess发出请求。当该请求处理时,我每250毫秒调用updateStatus来使用GetStatus()返回的值更新进度条。看看:

<button class="btn btn-primary" id="progressBtn">Click Me</button>
<div class="progress">
    <div class="progress-bar" id="probar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">
    </div>
</div>
<script>
    var percent = 0;
    $('#progressBtn').on('click', function () {
        var intervalID = setInterval(updateStatus, 250);
        $.ajax({
            type: "POST",
            url: '/Home/LongProcess',
            contentType: "application/json",
            dataType: "json",
            data: "{}",
            async: true,
            success: function () {
                clearInterval(intervalID);
            }
        });
    });
    function updateStatus() {
        $.ajax({
            type: "GET",
            url: '/Home/GetStatus',
            contentType: "application/json",
            dataType: "json",
            success: function (data) {
                percent = data * 10;
                $('#probar').css('width', percent + '%').attr('aria-valuenow', percent)
            }
        });
    }
</script>

问题:

不幸的是,GetStatus返回的值始终为零。我究竟做错了什么?帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

当您致电LongProcess时,这是一个新请求。然后,当您致电GetStatus时,每250ms会有一个请求。您的控制器类将针对每个请求进行初始化。对于每个Status请求,这意味着GetStatus属性为零。

希望你能得到这个想法。有关详细信息,请参阅this answer

您可以做的是将Status的值存储在中心位置(例如:在数据库中)并在SetStatus方法中更新。然后在GetStatus方法中,您可以获取存储的值。