Ответ 1
Здесь вы имеете дело с вызовом асинхронной функции. Результаты обрабатываются, когда они поступают, а не когда функция заканчивается.
Для чего нужны функции обратного вызова. Они вызывается, когда результат доступен.
function get(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
// defensive check
if (typeof callback === "function") {
// apply() sets the meaning of "this" in the callback
callback.apply(xhr);
}
}
};
xhr.send();
}
// ----------------------------------------------------------------------------
var param = "http://example.com/"; /* do NOT use escape() */
var finalUrl = "http://RESTfulAPI/info.json?url=" + encodeURIComponent(param);
// get() completes immediately...
get(finalUrl,
// ...however, this callback is invoked AFTER the response arrives
function () {
// "this" is the XHR object here!
var resp = JSON.parse(this.responseText);
// now do something with resp
alert(resp);
}
);
Примечания:
-
escape()
устарел с тех пор, как вечно. Дон не использовать его, он работает неправильно. ИспользуйтеencodeURIComponent()
. - Вы можете сделать синхронный вызов
send()
, установив параметрasync
open()
наfalse
. Это приведет к зависанию пользовательского интерфейса во время выполнения запроса, и вы этого не хотите. - Существует множество библиотек, которые были разработаны для упрощения и универсальности запросов Ajax. Я предлагаю использовать один из них.