Почему повторные ajax запросы в рекурсивной функции вызывают ошибку? - PullRequest
1 голос
/ 03 апреля 2020

У меня есть поле в базе данных, которое изначально установлено на 0, но может быть установлено на 1 другими пользователями сайта в любое время. Я хочу создать javascript, который ждет, пока поле не будет установлено на 1.

. Для этого я создал файл load-variable.php, который загружает и возвращает поле из базы данных. Затем я написал функцию javascript, которая загружает этот файл с использованием ajax и ожидает результата.

Если результат все еще равен 0, эта же функция вызывается снова с задержкой 500ms созданный функцией window.setTimeout. Если результат 1, вызывается другая функция continueScript, которая выполняет следующую часть программы.

Вот код:

function loadVariable() {

    xhr = new XMLHttpRequest();
    xhr.open('GET', 'load-variable.php', true);
    xhr.send();

    xhr.onload = function() {

        if (xhr.responseText == '0') {
            window.setTimeout(loadVariable, 500);
        } else {
            continueScript();
        } 
    }   
}

Если поле базы данных изменяется на 1 в течение примерно 15 секунд после первого вызова функции, эта функция работает очень хорошо.

Однако, если это занимает больше времени, в конечном итоге возникает ошибка (в последний раз, когда я проверял, это произошло после функция была вызвана 28 раз, что примерно после 15 секунд ожидания).

Мой браузер safari (возможно, проблема связана с настройкой браузера c?), и я получаю следующую ошибку:

Safari не может открыть страницу. Ошибка: «Операция не может быть завершена. Ошибка протокола »(NSPOSIXErrorDomain: 100)

Я что-то не так делаю? Повторяются ли ajax запросы в функции, которая называет себя правильным способом сохранения данных, или мой метод неверен и, таким образом, вызывает проблему?

Заранее спасибо за совет!


Обновление 04/04/20 (1)

Проблема действительно очень странная! После того, как эта ошибка была вызвана, потребуется еще 10–20 минут, чтобы я снова смог посетить мой сайт.

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


Обновление 04/04/20 (2)

Вот содержимое load-variable.php, которое считывает данные из базы данных mysql.

<?php

// Database details (I've obviously not included them here)
$servername = "";
$username = "";
$password = "";
$dbname = "";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

$sql = "SELECT Variable FROM Table WHERE Id='1';";
$query = mysqli_query($conn, $sql);

echo(mysqli_fetch_array($query)[0]);


exit();

?>

Обновление 04/04/20 (3)

Я сейчас тестировал эту проблему в chrome, и была также ошибка. Здесь было сообщение:

Ваш IP-адрес был заблокирован из-за подозрительного поведения.

Теперь мне кажется, что это мой сервер, который считает мое поведение подозрительным и, следовательно, блокирует меня на некоторое время. Являются ли повторные запросы на одно и то же поле в базе данных «подозрительными»?

1 Ответ

1 голос
/ 04 апреля 2020

Трудно сказать, где ваша проблема. L ie.

  • Какую базу данных вы используете? У вас есть блокировка базы данных, которая генерируется в какой-то момент?
  • Как вы выглядите php? Является ли их рекурсивная логика c в самом файле php?
  • Как выглядит ваш стек вызовов? Можете ли вы отследить результаты ваших вызовов базы данных и точно определить момент возникновения исключения?

Сказав это, на самом деле это не проблема с ajax, а скорее основная реализация. Давайте сделаем шаг назад и спросим себя, чего мы пытаемся достичь. Вы хотите следить за изменениями в своей базе данных, а также запускать и обновлять их при возникновении изменений. Похоже, вам нужно использовать наблюдаемый шаблон здесь. Действительно хороший пример того, как это реализовать, - посмотреть, как работает библиотека Redis .

Что касается ошибки, которую вы видите, давайте посмотрим, как работает Safari.

Safari поддерживает несколько протоколов HTTP. Когда сетевая библиотека пытается передать данные через Safari, Safari говорит: «Я поддерживаю следующие протоколы x и y». Когда вы изначально пытаетесь получить данные из вашей базы данных, это делается с использованием протокола HTTP x. В какой-то момент ваш сервер базы данных говорит Safari: «Эй, я говорю по более новому протоколу y, вместо этого говорите со мной по протоколу y», и отправляется заголовок обновления.

Когда Safari видит это, он интерпретирует это как «обновление до сетевого протокола y», но не может, так как он уже поддерживает этот сетевой протокол, и именно тогда всплывает ваше сообщение об ошибке.

Вы бы увидели эту ошибку с другой браузер? Вероятно, нет, так как другие браузеры, как правило, более снисходительны в этом случае использования.

Имеет ли эта ошибка какое-либо отношение к вашим ajax запросам? Возможно, но это не то, где вы должны искать решение «Мне нужно наблюдать за изменениями в моей базе данных и соответствующим образом обновлять мой интерфейс». Измените вашу реализацию так, чтобы она использовала что-то вроде mysql -events .

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

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