Являются ли вызовы методов Javascript потокобезопасными или синхронизированными?
Я все еще новичок в Javascript. Я разрабатываю простую страницу, где я нажимаю кнопку, получая значение на сервлете и отображаю его. Он работает хорошо, если я не нахожусь на сумасшедшей кнопке. Иногда отображаемый результат равен нулю.
Мне интересно, вызвано ли это одновременными вызовами одной и той же следующей функции:
function loadXMLDoc2(retr) {
var xmlhttp;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
$("#" + retr).button('option', 'label', xmlhttp.responseText);
// document.getElementById(retr).innerHTML=xmlhttp.responseText;
}
}
var param = "cmd=" + encodeURIComponent(retr);
document.getElementById("TOP_LEFT").innerHTML = param;
xmlhttp.open("GET","/WebFront/Asynclet?" + param,true);
xmlhttp.send(null);
}
Является ли Javascript потокобезопасным? А если нет, то как я могу синхронизировать или изолировать вызовы к этому методу?
Ответы
Ответ 1
Помимо веб-рабочих HTML5 (которые очень жестко контролируются), Javascript является однопоточным, поэтому нет проблем с безопасностью потоков. Один поток выполнения завершится до следующего запуска.
Такие вещи, как ответы ajax, проходят очередь событий и выполняются только в том случае, когда завершен какой-либо другой поток выполнения.
Смотрите Нужно ли беспокоиться о состоянии гонки с асинхронным Javascript? для получения дополнительной информации.
Для конкретного обсуждения обратных вызовов ответа ajax см. Как JavaScript обрабатывает ответы AJAX в фоновом режиме?.
Ответ 2
В контексте браузера JavaScript, по сути, является однопоточным. (Есть несколько новых функций браузера, которые предоставляют своего рода модель потоков, но взаимодействие потоков очень ограничено, и данные не могут быть напрямую разделены.)