Альтернативы для синхронного Javascript XMLHttpRequest (как тайм-аут в Safari)

Укороченная версия: Ищите метод ожидания Asynch XHR-запроса или способ заставить Synch XHR работать в Safari.

Гораздо длиннее версия: Я работаю над веб-службой, которая использует различные внешние источники данных, соединенные вместе. Я использую интерфейс Javacript, который делает AJAX / XHR-вызовы для моего PHP-кода сервера. Нет межсайтовых проблем, поскольку клиент запрашивает данные только с моего сервера (сервер запрашивает внешние данные).

Я использую синхронный XHR-запрос, поскольку у меня есть некоторая обработка после загрузки (сортировка, фильтрация и т. Д.) Для обработки данных перед их отображением на экране.

Все это прекрасно работает в IE, FF и Opera, но, похоже, является проблемой для Safari (я еще не пробовал Chrome).

Используя Firebug для Safari на моем компьютере с Windows, я вижу, что сервер вызывает beng made, а затем происходит сбой по истечении 10 секунд. На моем iPad сообщение выглядит немного лучше: NETWORK_ERR: XMLHttpRequest Exception 101: в синхронном режиме произошла ошибка сети.

Небольшое исследование показывает, что Safari отключится через 10 секунд в режиме синхронизации. Похоже, есть функция тайм-аута, которую вы можете использовать для ее увеличения (с максимальным пределом для Safari 60 секунд). К сожалению, я не могу заставить это работать.

Теперь мне интересно, что бы люди посоветовали как лучший способ обойти это через изменения в клиентском коде Javacript.

Два варианта, о которых я думаю: (i) найти рабочий пример таймаута синхронизации XHR, который будут соблюдать браузеры Safari; или (ii) иметь какую-то оболочку вокруг асинхронного XHR-вызова, чтобы обработка после загрузки сначала ожидала загрузки.

Я не очень опытный хакер Javascript, но я настроил немало средств на этот проект. Я не использовал JQuery или любые другие фреймворки и предпочел бы придерживаться необработанного JS, чтобы избежать необходимости изучать дополнительный синтаксис. [Вы можете видеть из моих предыдущих постов, которые я пытался использовать JQM и Spry в прошлом, но оба оказались неправильными, по крайней мере на данном этапе, и с тех пор были исключены на данный момент].

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

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

Цените мысли и советы людей по этому поводу.

С Уважением, Пит.

 CWSpear09 апр. 2012 г., 18:56
Я не смогу сильно помочь в этом конкретном вопросе, поскольку он был навсегда с тех пор, как я написал «старую школу». AJAX звонок. Я определенно хотел бы, чтобы вы снова посетили jQuery - если не сейчас, то скоро. Вы можете совершать сложные вызовы AJAX в несколько строк, которые снова и снова тестировались в разных браузерах. Раньше я сопротивлялся изучению jQuery, но теперь я понимаю, что это было ошибкой. Все это стоит потратить время на изучение сильных, более стабильных (и более простых в использовании) вызовов AJAX в одиночку.
 Peter Gross09 апр. 2012 г., 19:11
Привет, @Volkner. Я думаю, что jQuery, вероятно, будет разумным вариантом в не слишком отдаленном будущем, но я бы предпочел использовать обходной путь JS для этого прямо сейчас, если это возможно. Это вопрос приоритетов, и я очень хочу, чтобы мой сырой прототип работал как можно скорее и избегал времени, чтобы изучить дополнительные / альтернативные варианты прямо сейчас, если смогу.

Ответы на вопрос(1)

Решение Вопроса

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

Вы можете установить обратный вызов с помощьюonreadystatechange property изXMLHttpRequest:

xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {   // DONE
        if (xhr.status === 200) { // OK
            handleSuccess(xhr);
        } else {
            handleError(xhr);
        }
    }
};

Как следует из названия свойства, оно будет называться значениемreadyState изменения, где значение4 означает, что запрос выполнен (успешно или нет).

Затем вы выполняете сортировку, фильтрацию и т. Д. В другой функции - в этом примереhandleSuccess.

Вы также можете получить выгоду от использования любой из ряда существующих библиотек, например,JQuery (1.6 или позже для этого фрагмента):

$.get('/web/service/request')
    .done(function (result) {
        // sorting, filtering, etc
    })
    .fail(function (xhr) {
        // error notification, etc.
    });
 Peter Gross09 апр. 2012 г., 20:18
Бинго! Это сработало. Еще раз спасибо.
 Peter Gross09 апр. 2012 г., 19:17
Спасибо @Jonathan. Как только я прочитал это, я понял, что видел, как этот метод использовался ранее. Я попробую. Благодарю.

Ваш ответ на вопрос