Я пытаюсь прочитать из локального файла myjson.json и распечатать его содержимое в своем index.html. Я использую следующий код JavaScript:
function getJSON() {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/myfolder/myjson.json', false);
xhr.onreadystatechange = function () {
if (xhr.readyState == XMLHttpRequest.DONE) {
var response = xhr.responseText;
console.info("response: " + response); //Correctly prints JSON content to console
return response; //response is undefined when called from html
}
}
xhr.send(null);
}
Я вызываю функцию getJSON() следующим образом:
document.getElementById("contentOfJSON").innerHTML += "JSON: "+getJSON();
Это правильно выводит содержимое myjson.json в console.info, но мой HTML-элемент «contentOfJSON» содержит только «JSON: undefined». Почему я получаю неопределенный ответ, хотя console.info работает?
Вы возвращаете строку в вызов onreadystatechange.
Ваша функция getJSON ничего не возвращает.
Из того, что я видел, предполагается, что синхронизация обесценивается, поэтому просто сделайте ее асинхронной, передав функцию успеха в getJSON, а затем вызвав ее, передав строку результата в обратный вызов.
function getJSON(mycallback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/myfolder/myjson.json', false);
xhr.onreadystatechange = function () {
if (xhr.readyState == XMLHttpRequest.DONE) {
var response = xhr.responseText;
console.info("response: " + response); //Correctly prints JSON content to console
// call it here
mycallback(response);
}
}
xhr.send(null);
}
getJSON(function(result)
{
document.getElementById("contentOfJSON").innerHTML += "JSON: " + result;
});
Вот и все! Ты просто лучший! Спасибо!!!
Я вызываю xhr.open с параметром async = false. Так что я полагаю, что это синхронно. Я ошибся?