JavaScript, а l oop + setInterval не работает в Django - PullRequest
0 голосов
/ 20 июня 2020

Я разрабатываю веб-сайт, используя Django. У меня около 50 функций. На получение результата для всех из них уходит около 1 минуты.

Проблема в том, что я использую heroku для своего приложения. И у heroku есть лимит 30 se c на получение запроса. Мне предложили использовать фоновые задачи. Теперь я использую фоновые задания в Python RQ. Для каждой функции я сделал отдельную задачу в Views. Вот пример одной из задач:

task_robots_url = q.enqueue(Robots(url).get_url)
robots_url = task_robots_url.result

А теперь мне нужно проверить, завершено ли задание в шаблоне. И когда он закончится, отобразите результат.

Я хочу проверять с JS каждую секунду, завершена ли работа. Если он не закончен - показать пользователю сообщение «Загрузка ...». Если закончил - покажи результат.

Вот мой JS код:

  <script>
    var h1 = document.getElementById("h1");
    var job_result = "{{ robots_url }}"

    var test = function () {
      if (job_result ==  "") {
          h1.innerText = "Waiting...";
          } else if (job_result == "None") {
          h1.innerText = "Waiting ...";
          } else if (job_result == undefined) {
          h1.innerText = "Waiting ...";
          } else { 
          clearInterval(inter);
          h1.innerText = job_result; 
          }
      }
    var inter = setInterval(test, 1000);
  </script>

Но это не работает. Когда начинается страница результатов - у меня пустой результат. И он отображает "Ожидание". Тогда у меня нет результата. И он по-прежнему отображает "Ожидание". Но теперь после ожидания результата нет.

В документации для Python RQ сказано, что я должен поместить time.sleep () на несколько секунд в свой код. А если поставить time.sleep (2) - результат получил. Но если я поставлю time.sleep (2) для каждой из моих 50 функций - я получу 100 se c. И ограничение в Heroku составляет всего 30 сек c ... Поэтому мне нужно проверить и отобразить результат без sleep () ...

1 Ответ

1 голос
/ 20 июня 2020

Метод setInterval () вызывает функцию или оценивает выражение через указанные интервалы (в миллисекундах).

Метод setInterval () будет продолжать вызывать функцию до тех пор, пока не будет вызван clearInterval () или окно не будет закрыто.

Вы вызываете setInterval столько раз, что в конечном итоге заставляет ваш браузер отказывать sh.

предполагая, что значение job_result изменится после 10 se c, вы можете написать следующий код:

var job_result = {{ job_result }};

var loadingMessage = function (){
    if (!job_result) {
        document.write("Loading ...");
    }
    else {
        return
    }
}

setInterval(() => loadingMessage, 1000);

Вы можете вызвать return, чтобы остановить интервал для запуска, или вы можете использовать setTimeout и вызвать функцию, которая очищает интервал

...