2014-01-31 7 views
1

В следующих JS фрагмент кодаесть условие гонки в этом javascript?

request = new XMLHttpRequest 
request.open('GET', '/my/url', true) 
request.send() 

request.onload = function() { 
    data = JSON.parse(this.response) 
} 

должен уступка от нагрузки быть до отправки(), чтобы избежать состояния гонки. Или браузер справляется с этим для вас (пуская при загрузке, когда вы обходите его, чтобы назначить его).

+1

JavaScript в основном однопоточный, поэтому нет, состояние гонки не существует. –

+1

@PatrickEvans Я уверен, что браузер не будет инициировать запрос до тех пор, пока поток браузера не станет бесплатным. Но я не уверен, что это указано. Я полагаю, что некоторые браузеры могут реализовать это по-другому. –

+1

По крайней мере, считается хорошей практикой размещать обработчики событий перед вызовами 'open()' и 'send()', чтобы убедиться, что это не проблема, даже если шансы тонкие для состояния гонки, так легко убедитесь, что вы его избегаете. – adeneo

ответ

1

Ваш запрос должен выглядеть так:

var request = new XMLHttpRequest || new ActiveXObject('Microsoft.XMLHTTP'); 
request.open('GET', '/my/url'); 
request.onreadystatechange = function(){ 
    if(request.readyState == 4 && request.status == 200){ 
    console.log(request.responseText); 
    } 
} 
request.send(); 

Для дальнейшего ответа на ваш вопрос request.send() должно произойти в прошлом, потому что, если ответ приходит обратно, прежде чем функция присваивается request.onreadystatechange, не может быть проблемой, хотя это очень маловероятно, что ответ будет таким быстрым.

+1

Я довольно в большинстве реализаций JavaScript, это просто * невозможно * получить ответ обратно до того, как событие связано, потому что события запускаются только тогда, когда ему нечего запускать. Кроме того, я не думаю, что взлом «ActiveXObject» необходим с IE8 +; возможно, раньше. – mpen

+0

Функция, назначенная 'request.onreadystatechange', запускается при изменении' readyState'. 'request.send()', просто отправляет вашу информацию url на сервер, так как это запрос '' GET''. – PHPglue

+0

Я не уверен, что/если это имеет отношение к тому, что я только что сказал, или как onreadystatechange + readystate == 4 отличается от request.onload. Кажется, onload уволен сразу после изменения ReadyState. http://jsfiddle.net/mnbayazit/DJY5G/4/ – mpen

Смежные вопросы