Установить изменения интервала ID при вызове события - PullRequest
0 голосов
/ 19 января 2019

Ситуация!

Вот примерное воспроизведение рассматриваемой проблемы с настройкой идентификатора интервала и извлечением его.Существует 3 отдельных события, которые вызываются в зависимости от нажатия кнопки.

Одним из событий является запрос POST с использованием axios.Второй процесс - это, по сути, асинхронная функция, ожидающая завершения запроса POST.

Каждый интервал назначается переменной класса, а при вызове процесса другие процессы очищаются, чтобы избежать ненужного опроса django.view.

Все прекрасно работает с одним нажатием каждой кнопки процесса.

Проблема?

Так как для каждого события есть 3 отдельные кнопки, может быть возможность снова нажать одну из кнопок, что вызывает другое событие для принятияпоместите и также завершите другое событие, НО , процесс, кажется, не завершается при последовательном нажатии одной и той же кнопки.

Цикл событий

  • Кнопка 1 нажата.(Все работает хорошо.)
  • Нажата кнопка 2.(Все работает хорошо. Все счастливы.)
  • Нажата кнопка 3.(Все работает хорошо. Опять.)

  • Нажата кнопка 1.(Все работает хорошо.)
  • Нажата кнопка 1.(Все работает хорошо. Опять.)
  • Нажата кнопка 2.(Процесс 1 не был очищен. Процесс два начался одновременно.)

  • Нажата кнопка 1.(Процессы 1 и 2 выполняются одновременно.) <Обращаясь к двум последним событиям, которые имели место. </p>


Теперь, как мы видели по какой-то причине, другой цикл событий не 'Кажется, это заканчивается последовательными щелчками.Похоже, идентификаторы перезаписаны, и чистый интервал больше не может найти интервал после перезаписи.

Пример кода

class Handler {

    constructor () {
      this.interval1 = 0;
      this.interval2 = 0;
      this.interval3 = 0;
    }

    getToken(name) {
        var cookieValue = null;
            if (document.cookie && document.cookie !== '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) === (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
          return cookieValue;
    }

    process_one () {
      clearInterval(this.interval2);


      this.interval1 = setInterval(function() {
        console.log(" Polling 1. ")
      },300);
    }

    async process_two () {
      clearInterval(this.interval1);


      var scope_obj = this;
      this.interval2 = setInterval(async function() {
        console.log(" Polling 2. ");
        var data = await scope_obj.process_three();
      }, 500);
    }

    async process_three () {
      return axios( {
        url: "",
        data:{"data":"LOL"},
        headers :  {
          'X-CSRFToken': this.getToken('csrftoken'),
          'Content-Type': 'application/x-www-form-urlencoded'
        }
      } )
    }
  }

  let event = new Handler();

    $("#p1").click(function() {
      console.log("P1 started.")
      event.process_one ();
    })

    $("#p2").click(async function() {
      console.log("P2 started.")
      event.process_two ();

    })

    $("#p3").click(function() {
      console.log("P3 started.")
      event.process_three ();
    })

HTML-код.

<div class="row">
    <div class="col-lg-12">
      <button type="button" class="btn btn-warning" id="p1">P1</button>
      <button type="button" class="btn btn-warning" id="p2">P2</button>
      <button type="button" class="btn btn-warning" id="p3">P3</button>
    </div>
  </div>

1 Ответ

0 голосов
/ 19 января 2019

Ответ от Уроборуса был верным. До того, как я начал процесс, у меня была строка, которая заканчивала другой процесс, но не заканчивала правильный процесс. Распечатка удостоверения личности помогла мне понять, что удостоверения личности были перезаписаны.

  class Handler {

    constructor () {
      this.interval1 = 0;
      this.interval2 = 0;
      this.interval3 = 0;
    }

    getToken(name) {
        var cookieValue = null;
            if (document.cookie && document.cookie !== '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) === (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
          return cookieValue;
    }

    process_one () {
      clearInterval(this.interval2); // Clear the other interval.
      clearInterval(this.interval1); // Clear the current interval.

      this.interval1 = setInterval(function() {
        console.log(" Polling 1. ")
      },300);
    }

    async process_two () {
      clearInterval(this.interval1); // Clear the other interval.
      clearInterval(this.interval2); // Clear the current interval.

      var scope_obj = this;
      this.interval2 = setInterval(async function() {
        console.log(" Polling 2. ");
        var data = await scope_obj.process_three();
      }, 500);
    }

    async process_three () {
      return axios( {
        url: "",
        data:{"data":"LOL"},
        headers :  {
          'X-CSRFToken': this.getToken('csrftoken'),
          'Content-Type': 'application/x-www-form-urlencoded'
        }
      } )
    }
  }

Остальные части кода остаются прежними.

...