【发布时间】:2019-04-19 10:48:24
【问题描述】:
在进入任何主要框架之前,我目前正在学习 vanilla JS,以便掌握 HTTP 请求机制。我确信有很多更好的 JS 库可用于 HTTP 请求,但我想弄清楚如何使用经典的 XMLHttpRequest() 解决我的问题,因此请不要建议任何不包含 XMLHttpRequest() 的解决方案。
我正在尝试遍历我拥有的数组,并使用数组中的信息向 API 发出 HTTP GET 请求,然后用响应数据填充我的 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,而是循环首先打开所有请求,然后在它们到来时执行,并且当在 web 调试器中单步执行代码时,代码会在整个地方跳跃,它变得非常混乱(对不起,咆哮)。
我希望它一步一步地表现。我对 SO 进行了研究,有人建议这些是范围问题,并且请求应该在一个单独的函数中进行,这就是为什么我在一个函数中使用循环构建我的代码,在另一个函数中执行请求,但它仍然表现不佳前面描述过。请问有谁可以分享一下他们的专业知识吗?
【问题讨论】:
标签: javascript ajax xmlhttprequest