Как обновить глобальную переменную для успешного события изнутри функции (опрос)? - PullRequest
0 голосов
/ 11 июня 2018
<script>

var status = {{ check_status }};

call_polling = function() {
    // polling request to API (async)
    success:function(result){
        status = result.check_status;
    }

}


if(status) {
    var timer = setInterval(function() { call_polling(); }, 2000);
}
else{
clearInterval(function(){ call_polling();});
}
</script>

Итак, у меня есть код с асинхронным запросом для просмотра состояния внутреннего процесса.Итак, сначала я установил status в 1 (т.е. check_status через контекст в Django).Таким образом, если status равно 1, то строка var timer начнет вызывать функцию call_polling() каждые 2 секунды. Таким образом, call_polling() запросит API для проверки статуса и при успешном ответе, таком как {'check_status': 1}, передаст status = 1.Указывает, что бэкэнд-процесс все еще работает.Как только бэкэнд-процесс завершен, я передаю ответ JSON как {'check_status' : 0}, который должен быть status=0, и тогда он не переходит в if, а вместо этого очищает интервал опроса (поскольку мы знаем, что фоновая обработка уже завершена)и асинхронный вызов API должен прекратиться.

Но это не работает, и JavaScript все еще выполняет call_polling () к запросу API каждые 2 секунды.Я выяснил причину, поскольку var status объявлено глобально как 1, и даже если я заменю status = result.check_status.После контекста функции он всегда останется 1 и войдет в цикл if;независимо от того, что он получает от ответа JSON.

Итак, вопрос в том, как я смогу обновить status и очистить время ожидания (т. е. перейти к другой части), если result.check_status равно 0 (т. е. {'check_status': 2} как ответ от вызова API) ??

1 Ответ

0 голосов
/ 11 июня 2018

Вот как это сделать:

var status = {{ check_status }};

function call_polling() {
    // polling request to API (async)
    success: function (result){
        status = result.check_status;
        if (status) setTimeout(call_polling, 2000);
    }
}

call_polling();

Короче говоря, до тех пор, пока ответом является 1, устанавливается новый таймаут для проверки.

...