setInterval с вызовом ajax не будет вызывать успешные обратные вызовы, пока не будет завершена отправка другой формы - PullRequest
0 голосов
/ 30 октября 2018

У меня есть проект MVC, и у меня есть асинхронное действие, которое вызывает внешний API несколько раз в цикле (каждый раз передавая параметр diff). Я хотел бы, чтобы через некоторое время выполнялся другой вызов ajax, ожидая отправки этой формы, чтобы пользователь мог видеть, где они находятся. У меня есть следующая настройка, но все «успешные» обратные вызовы от вторичных вызовов, кажется, приостанавливаются / переводятся в состояние «ожидания», пока не будет завершена первая форма. Может кто-нибудь сказать мне, что я делаю не так?

Мое первое действие, которое вызывает основной код для циклического вызова API, настроено так:

public async Task<ActionResult> Default(

Этот процесс может занять несколько минут, поэтому я хотел обновить пользователя, которому передаются параметры. Я подумал, что когда форма отправляет запрос, вызывающий действие Defauly, я бы сделал setInterval с помощью вызова ajax другого действия Controller и возвратил бы некоторый 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). У меня есть кнопка, которая отправляет форму. Я пробовал оба типа 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();
        });
    });

Теоретически, это должно запускать мое действие Progress каждые 3 секунды с помощью ajax-вызова, пока моя долго работающая форма отправляется / обрабатывается. Я поставил точку останова в своем действии Progress. На самом деле происходит это предупреждение («test2»); выполняется каждые 3 секунды, как и ожидалось, и в инструментах разработчика браузера я вижу, что действие "Progress" вызывается при отображении состояния "в ожидании". Затем, когда завершенная форма отправки отправлена, ТОГДА моя точка останова попадает несколько раз (один раз за каждые 3 секунды обработки), и в конце я получаю бомбардировку с кучей предупреждений («test1: каким бы ни был конечный статус») ) кучу раз подряд.

Я попытался извлечь из этого всю форму Default и просто удерживал кнопку, которая выполняла тот же код JS (вызывая это действие Progress), и она работала просто отлично, выполняя функцию обратного вызова каждые 3 секунды. только когда отправляется другая форма, вызовы ajax кажутся «приостановленными» до тех пор, пока не будет завершена первая форма.

Есть ли способ убедиться, что эти вторичные функции обратного вызова ajax выполняются, пока выполняется первая форма?

1 Ответ

0 голосов
/ 31 октября 2018

Бам!

Я добавил этот атрибут чуть выше имени класса, и он начал работать. [SessionState (System.Web.SessionState.SessionStateBehavior.ReadOnly)]

Я полагаю, что по умолчанию MS не позволяет одновременно запускать различные действия в случае изменения переменных сеанса, и они испортились. Эта простая линия заботится об этом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...