Как заблокировать функции AJAX от перекрытия? - PullRequest
5 голосов
/ 10 марта 2010

У меня есть одна функция checkEvery15Seconds, которая запускается каждые 15 секунд. Он проверяет, были ли добавлены новые комментарии на страницу.

У меня есть форма, которая отправляет новый комментарий после нажатия кнопки отправки, а затем отображает новый комментарий на странице.

В процессе добавления нового комментария checkEvery15Seconds одновременно запрашивает базу данных, поэтому я получаю дубликаты комментариев на странице (но не в базе данных, это чисто проблема JavaScript).

Как мне заставить мою функцию submitComment остановить checkEvery15Seconds и перезапустить ее после завершения выполнения функции submitComment?

Ответы [ 4 ]

5 голосов
/ 10 марта 2010

добавить логическое значение с именем suspend15sCheck в область видимости, доступную для обеих функций. включите его при добавлении комментария, а затем снова установите значение false.

в вашей функции 15sCheck вы сначала должны проверить, разрешено ли вам проверять: -)

var suspend15sCheck = false;

function addComment()
{
  suspend15sCheck = true;

  // add comment on base of form data

  suspend15sCheck = false;
}

function myTimer()
{
    if(suspend15sCheck === false) 
    {

      // add comments via ajax request
      // remember to check if the comments who will be added already exist :-)

    }
}
0 голосов
/ 10 марта 2010

Вам понадобится переменная состояния, чтобы указать текущее состояние комментария ajax-запроса.

var requestComments = false;

if(requestComments === false) {
  requestComments = true;
  // make ajax request

  // on ajax success/fail
  requestComments = false;
}
0 голосов
/ 10 марта 2010

Самое простое решение: используйте помечающую переменную, которую вы включаете и выключаете. Первая строка вашей функции "checkEvery15Seconds" гласит: if (!global_checkingEvery15Seconds) return;

Просто установите для этой переменной (как бы вы ее ни называли, глобальную или привязанную к объекту) значение true, если хотите, чтобы проверка была включена, и выключите, если этого не делать.

0 голосов
/ 10 марта 2010

Оберните его в объект, который позволяет другим функциям устанавливать для него флаги запуска / остановки.

function My15SecondsObj() {
    var objSelf = this;

    // 
    this.run();
}

My15SecondsObj.Paused = false;
My15SecondsObj.prototype.run= function() { 
   if (!Paused)
   {
      // Do your call here
   }
   var _this = this;
   setTimeout(function() { _this.run(); }, 15000);

}

Теперь, когда вы хотите использовать этот объект, просто сделайте

var myObj = new My15SecondsObj();

и когда вы хотите сделать паузу,

myObj.Paused = true;

и запустите его снова, выполнив:

myObj.Paused = false;

Добавьте некоторые события, если вы хотите по-настоящему сойти с ума, чтобы другие объекты могли подписаться на уведомления об успешном обновлении базы данных и т. Д. *

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