Есть ли причина использовать синхронный запрос XMLHttpRequest? - PullRequest
85 голосов
/ 18 января 2010

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

Ответы [ 18 ]

2 голосов
/ 18 января 2010

Что произойдет, если вы сделаете синхронный вызов в рабочем коде?

Небо падает.

Нет, серьезно, пользователю не нравится заблокированный браузер.

2 голосов
/ 18 января 2010

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

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

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

2 голосов
/ 19 января 2010

XMLHttpRequest традиционно используется для асинхронных запросов. Иногда (для отладки или конкретной бизнес-логики) вы хотите изменить все / несколько асинхронных вызовов на одной странице для синхронизации.

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

2 голосов
/ 19 января 2010

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

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

2 голосов
/ 18 января 2010

Иногда у вас есть действие, которое зависит от других.Например, действие B может быть начато только после завершения A.Синхронный подход обычно используется, чтобы избежать условий гонки .Иногда использование синхронного вызова является более простой реализацией, чем создание сложной логики для проверки каждого состояния ваших асинхронных вызовов, которые зависят друг от друга.

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

1 голос
/ 01 мая 2014

У меня просто была ситуация, когда асинхронные запросы для списка URL-адресов, вызываемых последовательно с использованием forEach (и цикла for), вызывали отмену оставшихся запросов. Я переключился на синхронный, и они работают как задумано.

1 голос
/ 23 августа 2013

Firefox (и, вероятно, все браузеры не IE) не поддерживает асинхронный XHR timeOut.

  1. обсуждение Stackoverflow
  2. Mozilla Firefox XMLHttpRequest

HTML5 WebWorkers doтаймауты поддержки.Таким образом, вы можете обернуть запрос синхронизации XHR в WebWorker тайм-аутом, чтобы реализовать асинхронный XHR с поведением тайм-аута.

0 голосов
/ 23 января 2018

Ну вот одна веская причина.Я хотел сделать запрос http, а затем, в зависимости от результата, вызвать click () для типа ввода = файл.Это невозможно с асинхронным xhr или fetch.Обратный вызов теряет контекст «пользовательское действие», поэтому вызов click () игнорируется.Синхронный xhr спас мой бекон.

onclick(event){
    //here I can, but I don't want to.
    //document.getElementById("myFileInput").click();
    fetch("Validate.aspx", { method : "POST", body: formData, credentials: "include" })
    .then((response)=>response.json())
    .then(function (validResult) {
        if (validResult.success) {
            //here, I can't.
            document.getElementById("myFileInput").click();
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...