Ответ 1
Ожидается синхронный (блокирующий) запрос типа.
var it_works = false;
jQuery.ajax({
type: "POST",
url: 'some_file.php',
success: function (data) {
it_works = true;
},
async: false // <- this turns it into synchronous
});
// Execution is BLOCKED until request finishes.
// it_works is available
alert(it_works);
Запросы асинхронные (неблокирующие) по умолчанию, что означает, что браузер не будет ждать их завершения, чтобы продолжить работу. Вот почему ваше предупреждение получило неправильный результат.
Теперь, jQuery.ajax
, вы можете указать, что запрос синхронный, что означает, что script будет продолжать работу только после завершения запроса.
РЕКОМЕНДУЕМЫЙ, однако, относится к рефактору вашему коду, чтобы данные были переданы функции callback, как только запрос завершен. Это предпочтительнее, поскольку выполнение блокировки означает блокировку пользовательского интерфейса, что неприемлемо. Сделайте это так:
$.post("some_file.php", '', function(data) {
iDependOnMyParameter(data);
});
function iDependOnMyParameter(param) {
// You should do your work here that depends on the result of the request!
alert(param)
}
// All code here should be INDEPENDENT of the result of your AJAX request
// ...
Асинхронное программирование немного больше сложное, потому что следствие выполнения запроса инкапсулируется в функцию вместо того, чтобы следовать заявлению запроса. Но поведение в режиме реального времени, которое использует, может быть значительно лучше, потому что они не будут видеть вялый сервер или вялую сеть. браузер, чтобы действовать так, как будто он разбился. Синхронное программирование неуважительноеи не должны использоваться в приложениях, которые используются людьми.
Дуглас Крокфорд (Блог YUI)