Прежде всего, хотя это правда, что javaScript является однопоточным, это НЕ правда, что приложение javaScript никогда не требует механизма сериализации.
Простой пример, когда кнопка отправки должна исчезать в течение заданного промежутка времени, в течение которого работает Ajax-запрос к серверу. Когда асинхронный Ajax-запрос успешно завершается, должно появиться сообщение о том, где раньше находилась кнопка.
Хотя было бы неплохо иметь возможность отменить затухание кнопки и просто установить ее стиль на «display: none», как только запрос Ajax завершится, это невозможно в jQuery. Кроме того, решение могло бы использовать События для синхронизации двух одновременных действий, но это по существу излишне для простой проблемы.
Низкотехнологичное решение состоит в том, чтобы опросить блокировку, и когда затухание завершается, она разблокируется, но сообщение «сервер завершен» НЕ отображается до тех пор, пока не будет выполнен обратный вызов успеха, заданный $ .post.
var gl_lock;
var gl_selfID;
function poll_lock(message) {
if (gl_lock === 0) {
$('#output').text(message).fadeIn(200);
window.clearInterval(gl_selfID);
}
} // end of poll_lock
function worker() {
// no one gets in or out
gl_lock = 1;
$.post(..., data,function() {
gl_selfID = window.setInterval(poll_lock, 40, data.message);
}, "json");
// end of fadeout unlock the semaphore
$('#submit-button').fadeOut(400, function() { gl_lock = 0; });
} // end of worker
Наконец, я думаю, что это более подробный ответ, в соответствии с ранее предложенным perrohunter в этом обсуждении.