Обновление: исправлено несколько формулировок вокруг onreadystatechange
и readyState
.
Ваш трюк с включением или выключением вещи является изящной идеей, хотя я не уверен, будет ли это работать или безопасно. В любом случае, непосредственная проблема с кодом, который вы показали, заключается в том, что он не учитывает тот факт, что вы используете асинхронные запросы.
Ваш код выполняется в том порядке, в котором он написан, но асинхронные c запросы не задерживают выполнение, поэтому 2-ой XMLHttpRequest
до url
запускается почти сразу и задолго до первого Transition()
завершено.
Если вам нужно, чтобы что-то происходило последовательно, вам необходимо вызвать последующие шаги из обработчика события request onreadystatechange
, который запускается при изменении состояния запроса. Код уже проверяется на readyState 4
, что означает, что запрос выполнен. Таким образом, вызываемый там код запускается после того, как запрос завершен.
Я не уверен, что делает какой-то ваш код, возможно, он скопирован здесь вне контекста (например, каков ваш * 1022). * и doNothing
?).
Вот рабочий JSFiddle на основе вашего кода , использующий фиктивный URL для всех 3 запросов. Я включил кучу журналов, откройте вашу консоль разработчика, чтобы увидеть порядок запуска, запуска и завершения.
Идея состоит в том, чтобы передать обратный вызов в первый Transition
, который будет запущен после завершения этого запроса:
function downloadUrl() {
Transition(foo);
}
Transition
принимает обратный вызов в качестве параметра и запускает после завершения:
function Transition(callback) {
// ... your code ...
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
if (callback) {
callback();
}
}
};
// ... your code
}
Здесь foo()
- это функция, которая выполняет фактическую загрузку url
, в основном всего, что у вас есть в downloadUrl()
, но без вызовов Transition
.
Когда foo()
завершено, вам нужно снова вызвать Transition
, но на этот раз мы не хотим ничего запускать, когда это будет сделано, поэтому мы передаем false
, который Transition
проверит и пропустит пытаясь выполнить.
Я написал это быстро, и это кажется немного неуклюжим, вы, вероятно, могли бы немного помассировать это, чтобы привести его в порядок, но это демонстрирует основную c идею использования обработчиков событий для выполнения задач последовательно с асин c запросами.