Как различные браузеры обрабатывают таймаут с синхронным XHR

В среду система AJAXy CRM, которую я поддерживаю, для многих пользователей была нарушена, поскольку Firefox начал сообщать: "Использование атрибута тайм-аута XMLHttpRequest не поддерживается в синхронном режиме в контексте окна". Другие основные браузеры все еще работают нормально, так как обходной путь я посоветовал людям не использовать Firefox.

Из того, что я понимаю, синхронные запросы - это Bad Thing, поэтому я могу только предположить, что последнее обновление для Firefox остановило его от размещения Bad Things. Все предыдущие обсуждения (здесь и в Интернете) подразумевают, что использование атрибута тайм-аута с синхронными объектами XMLHttpRequest не должно работать вообще, что заставляет меня задаться вопросом, почему он, по-видимому, делает (за исключением Firefox со среды).

Являются ли другие браузеры/старый Firefox фактически реализацией времени ожидания, когда они "не должны", или просто игнорируют исключение и продолжают выполнение (а не спасаются, как новый Firefox)?

EDIT: я не могу получить код прямо сейчас, но это было так: if (c.somekindoftimeouthandler !== "unassigned" && this.timeout) {
c.timeout = this.timeout
//more stuff about the handler etc...
}
где 'this' возникает сложная вещь, предположительно унаследованная от XMLHTTPRequest, а "c" - это конкретный объект, ссылающийся на конкретный запрос AJAX или что-то в этом роде. Я приду чисто, я мало знаю об обоих Javascript и этом специфическом CRM на основе сахара, но суть кода проста. Это был универсальный объектно-ориентированный способ подачи запросов, и этот конкретный 4-строчный или около того имел дело, когда запрос был истек. У меня создается впечатление, что это была абстрактная база, из которой должны были специализироваться конкретные запросы (или запрашивающие сущности). Двигатель Javascript Firefox зажимается на this.timeout.

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

Ответы

Ответ 1

IE позволяет "тайм-ауту" работать для синхронизации XHR. Если время таймаута будет достигнуто, это вызовет исключение из send(), я полагаю.

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

Другие браузеры (и старый Firefox) не поддерживают тайм-аут; у них даже нет собственности. Поскольку ваш script нюхает, существует ли свойство, он даже не пытается установить тайм-аут в этих других браузерах, поэтому он работает там: ваш script не пытается делать плохие вещи, поэтому эти браузеры не исключайте исключения.

Итак, все, что изменилось, заключается в том, что Firefox добавил поддержку свойства timeout, но вместо того, чтобы делать то, что IE выполняет, что говорит спецификация. И ваш script предполагал, что любой браузер, который реализует это свойство, будет работать так, как IE делает...