2015-06-16 3 views
0

Вот мой пример кода. (Причина, по которой мне нужно отправлять синхронные запросы, состоит в том, что на самом деле мне нужно отправить несколько запросов, и каждый запрос зависит от ответа предыдущего запроса. И причина, по которой мне нужно установить обратные вызовы, заключается в том, что я хочу показать некоторый счетчик, так что пользователи знают статус сценария.)когда будет выполняться обратный вызов для синхронных вызовов xmlHttpRequest?

var xmlhttp =new XMLHttpRequest(); 
xmlhttp.onreadystatechange=function() { 
    if (xmlhttp.readyState==2) { 
    document.getElementById("p2").style.color = "blue"; //statment 1 
    } 
    if (xmlhttp.readyState==4) { 
    document.getElementById("p2").style.color = "red"; //statment 2 
    } 
} 
xmlhttp.open("GET","ajax_info.txt",false); 
xmlhttp.send(); 
balblabla(); // a time-cost function 

Тогда у меня есть 2 вопроса. Во-первых, когда оператор 1 и оператор 2 фактически выполняются? Гарантируется ли выполнение перед balblabla()?

Во-вторых, даже если инструкция 1 и инструкция 2 выполняются, кажется, браузер не изменит отображаемый цвет до тех пор, пока не будет закончен blablabla(). Есть ли способ сделать изменение цвета отображаемым до того, как blablabla() закончил? (предполагается, что blablabla() занимает много времени)

Спасибо!

+1

1) TIAS! 2) Нет, но вы можете разделить blablabla() на несколько функций, используя обратный вызов с коротким таймером для перехода от одного к другому. – ikegami

+0

Почему вы используете обратные вызовы вообще в запросе на синхронизацию? И почему вы используете SJAX? (вот почему ваши изменения цвета не работают) – Bergi

+0

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

ответ

1
  1. Если XHR является синхронным, то обратные вызовы выполняются до .send() возвращается. Другими словами, до blablabla().

  2. Обновления DOM браузера асинхронны. Вернее, перерисовки асинхронны (DOM update/reflow может время от времени быть синхронным, но не отображать на экране, просто обновлять структуры данных).

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


примечание: чтобы быть четким, перерисовка происходит только тогда, когда интерпретатору javascript больше нечего запускать. Другими словами, окно браузера будет обновляться только после завершения выполнения blablabla().

Если blablabla() занимает много времени, вы можете разбить цикл, используя setTimeout(), чтобы сделать его асинхронным. В качестве альтернативы вы можете попробовать использовать веб-мастеров.

+0

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

+0

@ user3462510: Смотрите следующее: http://stackoverflow.com/questions/4631774/coordinating-parallel-execution-in-node-js/4631909#4631909 и это: http://stackoverflow.com/questions/13250746/process -chain-of-functions-without-ui-block/13252018 # 13252018 для примеров того, как управлять несколькими асинхронными запросами. Второй ответ можно использовать для обработки ряда связанных запросов, таких как веб-искатель. – slebetman