带有ajax调用的setInterval不会触发成功回调,直到完成另一种表单提交为止

时间:2018-10-30 17:43:03

标签: c# jquery ajax asp.net-mvc asynchronous

我有一个MVC项目,并且有一个异步操作,该操作在一个循环中多次调用外部API(每次都传递一个diff参数)。我想在等待提交此表单的同时,每隔一段时间执行一次ajax调用,以便用户可以看到他们所在的位置。我具有以下设置,但是来自辅助调用的所有“成功”回调似乎都已暂停/置于“待处理”状态,直到完成第一种形式为止。有人可以告诉我我在做什么错吗?

我的第一个调用主代码以遍历API调用的动作是这样设置的:

public async Task<ActionResult> Default(

此过程可能需要几分钟,因此我想更新正在传递参数的用户。我计算出提交提交时调用Defauly操作的表单时,我将使用ajax调用另一个Controller操作来执行setInterval并返回一些json以返回给用户,让他们知道静态变量的值,该变量在环。因此,在控制器顶部添加了

private static string mystatus = "started";

在for循环中,我更新了此“ mystatus”。我添加了另一个操作

public ActionResult Progress()
{
    dynamic showMessageString = string.Empty;
    showMessageString = new
    {
        param1 = mystatus,
    };
    return Json(showMessageString, JsonRequestBehavior.AllowGet);
}

因此,我尝试在常规表单和Ajax表单(Html.Beginform和Html.AjaxForm)中都设置Default操作。我有一个提交表单的按钮。我尝试了SUBMIT类型和BUTTON类型,并与后者手动提交。点击按钮时,这是在表单提交时处理它的JS代码

function alertMe() {
    alert("start");
    setInterval(function () {getStatus();}, 3000);
}

function getStatus() {
    $.ajax({
        url: '/Home/Progress',
        dataType: 'json',
        type: 'POST',
        success: function (responseText) {
            alert("test1: " + responseText.param2);
        }
    });
    alert("test2");
    }

    $(document).ready(function () {
        $('#submitme').click(function () {
            alertMe();
        });
    });

理论上,当我长时间运行的表单正在提交/研读时,这应该每3秒用ajax调用一次我的Progress操作。我在“进度”动作中添加了一个断点。实际发生的是此alert(“ test2”);会按预期每3秒执行一次,并且在浏览器开发人员工具中,我可以看到状态显示为“正在执行”的调用“进度”。然后,当长时间运行的表单完成提交后,我的断点就会被击中很多次(每处理3秒一次),最后我受到一堆警报的轰炸(“ test1:无论最终状态是什么” )连续很多次。

我尝试从中取出整个Default表单,只是保留了执行相同JS代码的按钮(称为Progress动作),并且效果很好,每3秒执行一次成功回调函数。只有在提交另一种表单时,ajax调用才会“暂停”,直到完成第一种表单为止。

有没有一种方法可以确保在执行第一种形式的同时执行这些辅助ajax回调函数?

1 个答案:

答案 0 :(得分:0)

Bam!

我在类名上方添加了此属性,它开始起作用。 [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]

我想MS默认情况下不会让您同时运行不同的操作,以防您更改会话变量而弄乱了它们。这行很简单