В настоящее время я изучаю vanilla JS, прежде чем переходить к каким-либо основным фреймворкам, чтобы я мог справиться с механикой HTTP-запросов.Я уверен, что существует масса лучших JS-библиотек для HTTP-запросов, но я хочу выяснить, как решить мою проблему с помощью классической XMLHttpRequest (), поэтому, пожалуйста, не предлагайте никаких решений, которые не включают XMLHttpRequest ().
Я пытаюсь перебрать имеющийся у меня массив и сделать HTTP-запрос GET к API с информацией в массиве, а затем заполнить мой HTML данными ответа.Код довольно прост:
Функция, которая принимает мой массив чисел:
function loadUniqueProjs(uniqueArray)
{
var reqObject = [];
for (var i in unique_array)
{
outsideLoopRequest(unique_array[i], reqObject, i);
}
}
Я перебираю массив и выполняю функцию, котораядолжен выполнить мой запрос GET:
function outsideLoopRequest(arrayValue,reqObject, i){
// Create XHR Object
reqObject[i] = new XMLHttpRequest();
reqObject[i].open('GET', 'http://localhost:3000/resource/Projects/' + arrayValue, true)
reqObject[i].onload = function() {
if (this.status == 200) {
var client = JSON.parse(this.responseText);
var output = '';
for (var j in client){
output += '<div class="card">'+
'<h5 class="card-header" role="tab" id="heading'+ j + '">'+
'<a data-toggle="collapse" data-parent="#accordion" style="color:black"' +
'href="#collapse' + j + '"aria-expanded="false" aria-controls="collapse' + j + '"class="d-block collapsed">' +
'<i class="fa fa-angle-double-down pull-right"></i>#' +
client[j].projectTitle + ' | ' + 'PM: ' + client[j].projectManager + ' | ' +
'PO: ' + client[j].projectOwner + ' | ' + 'Estimated Deadline: ' + client[j].predictedCompletion +
' | ' + 'Status: ' + client[j].status +
' | ' + 'Requestor: ' + client[j].requestor +
'</a>'+
'</h5>'+
'</div>';
}
}
document.getElementById("spinner").hidden = true;
// output the data into the HTML page
document.getElementById('accordion').innerHTML = output;
console.log(this.status + ' Data retrieved successfully!');
}
reqObject[i].send();
}
После нескольких часов пошаговой отладки я узнал, что HTTP-запросы асинхронны, и при использовании цикла для выполнения запросов один за другим они не будутведите себя так, как вы хотите.Запросы не выполняются один за другим с добавлением необходимого мне HTML-кода, вместо этого цикл сначала открывает все запросы, а затем выполняет их по мере поступления, и при пошаговом выполнении кода в веб-отладчике код перепрыгивает повсюду, где он становится чрезвычайно запутанным(извините за разглагольствования).
Я бы хотел, чтобы он вел себя шаг за шагом.Я провел исследование SO, и кто-то предположил, что это проблемы с областями видимости, и что запросы должны выполняться в отдельной функции, поэтому я структурировал свой код с помощью цикла в одной функции и выполнения запроса в другой, но он по-прежнему работает неправильно.описано ранее.Кто-нибудь может поделиться своим опытом, пожалуйста?