Проблема была в том, как я не понял, как работают асинхронные функции.Однажды я понял, что вторая строка console.log(xmlDoc.getElementsByTagName("example")[0].getAttributeNode("name").nodeValue);
не может быть выполнена сразу, потому что асинхронная функция должна быть завершена.
Я переключился на реализацию обещания, но потом у меня возник вопрос, является ли хорошим вариантом позволить глобальной переменной или переменной класса быть нулевым, пока не завершится асинхронная функция, и я написал для этого еще один вопрос: Каков хороший дизайн для глобальных переменных из асинхронных функций в Javascript?
Однако в настоящее время я делаю следующее:
self.xmlDoc = null;
this.promiseXML = new Promise(function(resolve, reject){
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "xmls/EXAMPLE.xml", true);
xhttp.onload = function(){
if(xhttp.status == 200){
self.xmlDoc = xhttp.responseXML;
resolve();
}else{
reject(xhttp.statusText);
}
};
xhttp.onerror = function(){
reject(xhttp.statusText);
}
xhttp.send();
})
this.promiseXML.then(function(){
console.log(self.xmlDoc.getElementsByTagName("parameter")[0].getAttributeNode("name").nodeValue);
}).catch(function(err){
console.log(err);
});
Может показаться, чтоМоя проблема повторного использования xmlDoc
не обязательно решена, потому что если вы попробуете console.log(self.xmlDoc.getElementsByTagName("example")[0].getAttributeNode("name").nodeValue);
сразу после обещания, она все равно будет нулевой.Тем не менее, я буду делать все, что мне нужно, в рамках обещания, и как только приложение будет запущено, оно обязательно будет инициировано self.xmlDoc
.
Поэтому, если его необходимо использовать после внесения изменений пользователем,это будет работать без проблем.Моя первоначальная ошибка была из-за того, что я пытался запустить мой console.log
до того, как пройдет какое-то время.
Чтобы узнать, как мой исходный код не работал, изучите комментарий Дэниела и посмотрите на асинхронные функции и обратные вызовы,Изучение цикла событий в javascript также полезно.
Для хорошего подхода к дизайну я все еще не уверен, но вы можете попробовать ответить на другой мой вопрос, или, возможно, кто-то поможет с комментарием.
PS: Использовать обещание не обязательно, но в моей ситуации это только казалось лучшей практикой.