Как определить, когда несколько запросов AJAX завершены или не выполнены? - PullRequest
1 голос
/ 21 апреля 2011

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

Мой метод работы такой:

  1. Отображение сообщения о загрузке.
  2. Инициализировать запросы AJAX.
  3. Запустить интервал таймера, чтобы проверить, все ли загружено.
  4. После загрузки данных инициализировать приложение и т. Д.
  5. Если данные не загружались, отобразите сообщение об ошибке.

Проблема с # 5 - как определить, была ли ошибка?Например, если возникла проблема с соединением или сервер по какой-либо причине отправил обратно неверные данные.Вот мой текущий код - downloadData просто выполняет базовый AJAX-запрос:

// check local storage and download if any missing  
if ( !checkLocalStorage() )
{
    $('#content').before( '<div class="notice" id="downloading">Downloading data, please wait...</div>' );
    for ( var i in db_tables )
    {
        if ( localStorage[db_tables[i]] == null )
            downloadData( db_tables[i] );
    }       
}

// check progress
var timer = setInterval( function() {
    if ( checkLocalStorage() )
    {
        // everything is downloaded
        $('#downloading').hide();
        clearInterval(timer);
        initApp();
    }
}, 500 );

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

Не могли бы вы немного перевернуть это? Нечто подобное (с разумными именами переменных и «настоящим» API) упростило бы вещи:

  1. Показать сообщение о загрузке.
  2. Создание инициализатора приложения, ai.
  3. Подтвердите запросы AJAX:
    • Успешные обработчики вызова ai.finished(task).
    • Обработчики ошибок вызывают ai.error(task).
    • Зарегистрируйтесь в инициализаторе ai.register(task), если требуется проверка "Вы слишком долго".
  4. Как только все запросы AJAX вызвали ai.finished, инициализируйте приложение и т. Д.
  5. Если какая-либо из задач AJAX называется ai.error, отобразите сообщение об ошибке и начните очистку.

Таким образом, вам не нужно будет setInterval(), и отдельные задачи AJAX сообщат вам, когда они закончатся или упадут. Возможно, вы все еще хотите, чтобы интервал имел дело с задачами, которые занимают слишком много времени, но большая часть логики будет основываться на уведомлениях, а не на опросе.

0 голосов
/ 21 апреля 2011

Просмотр ваших реальных вызовов ajax в downloadData поможет, но я предлагаю вам еще раз просмотреть jquery AJAX API .Вызовы Ajax имеют обратные вызовы не только для общего завершения, но и для успеха и неудачи, включая ошибки.Попробуйте сделать что-то вроде повторения, если есть ошибка, и если она продолжает сбой, вы можете предупредить пользователя.Вы также можете использовать эти обратные вызовы, чтобы уведомить ваше приложение о завершении загрузки вместо использования интервального таймера.

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