проблема в том, как вы используете объект XMLHttpRequest (). Поскольку вы указали true
в ajaxRequest.open("GET", URL, true);
, вы фактически запрашиваете, чтобы запрос был выполнен в асинхронном потоке, чтобы основной поток не блокировался. Это хороший дизайн для приложений HTML, но он требует от вас лучшего понимания того, как лучше обрабатывать результаты, возьмем следующий пример:
<html>
<head>
<title>ALAMI Test</title>
<script language="JavaScript">
function doit(URL) {
console.log('mainthread - doit begin');
var ajaxRequest = new XMLHttpRequest();
ajaxRequest.open("GET", URL, true);
ajaxRequest.onreadystatechange = function() {
if (ajaxRequest.readyState === 4) {
console.log('asyncthread - readystatechange begin');
var ajaxResponse = ajaxRequest.responseText.split("\n");
var extensionLocation = URL.lastIndexOf('.');
console.log('asyncthread - readystatechange end');
}
}
console.log('mainthread - ajaxRequest.send');
ajaxRequest.send(null);
console.log('manthread - doit end');
}
</script>
</head>
<body>
<input type="button" value="doit" onclick="doit('http://localhost/fulldictionary.txt')"/>
</body>
Обратите внимание на места, где я отметил console.log
и которые находятся в mainthread и которые находятся в asyncthread . Если вы должны запустить скрипт, вы должны увидеть следующий текст в консоли:
LOG: mainthread - doit begin
LOG: mainthread - ajaxRequest.send
LOG: manthread - doit end
LOG: asyncthread - readystatechange begin
LOG: asyncthread - readystatechange end
То, как вы написали свой сценарий, вы предполагали, что результаты происходят синхронно, т.е.
LOG: mainthread - doit begin
LOG: mainthread - ajaxRequest.send
LOG: asyncthread - readystatechange begin
LOG: asyncthread - readystatechange end
LOG: manthread - doit end
именно поэтому ваш скрипт не работает. Правильный дизайн - продолжать работать с асинхронной нитью, но использовать ее для «обратной отправки» записей, найденных в вашем объекте ALAMI. Таким образом, вы не можете использовать следующую строку кода:
ALAMI.Hangman.Wordlist = ALAMI.XHR.Get('fulldictionary.txt');
Поскольку, когда основная тема завершается, список слов все еще неизвестен, вместо этого вы должны переписать его следующим образом:
ALAMI.XHR.Get('fulldictionary.txt');
И в рамках реализации вашего асинхронного потока вы должны сделать так, чтобы он заполнял ваш список слов.
т.е. требуется редизайн.