Являются ли вызовы методов Javascript потокобезопасными или синхронизированными? - PullRequest
15 голосов
/ 23 октября 2011

Я все еще новичок в 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 поточно-ориентированным?И если нет, как я могу синхронизировать или изолировать вызовы этого метода?

Ответы [ 2 ]

37 голосов
/ 23 октября 2011

Кроме веб-работников HTML5 (которые очень жестко контролируются), Javascript является однопоточным, поэтому проблем с безопасностью потоков не возникает. Один поток выполнения завершится до запуска следующего.

Такие вещи, как ответы ajax, проходят через очередь событий и выполняются только после завершения любого другого потока выполнения.

См. Нужно ли беспокоиться о состояниях гонки с асинхронным Javascript? для получения дополнительной информации.

Конкретное обсуждение обратных вызовов ajax смотрите в Как JavaScript обрабатывает ответы AJAX в фоновом режиме? .

4 голосов
/ 23 октября 2011

В контексте браузера JavaScript по сути является однопоточным. (Существуют некоторые новые функции браузера, которые обеспечивают своего рода модель потоков, но взаимодействие потоков очень ограничено, и данные не могут быть напрямую переданы.)

...