Javascript 尝试使用XMLHttpRequest获取JSON对象失败,导致引用为空

Javascript 尝试使用XMLHttpRequest获取JSON对象失败,导致引用为空,javascript,json,functional-programming,xmlhttprequest,fetch,Javascript,Json,Functional Programming,Xmlhttprequest,Fetch,我试图在Javascript中使用XMLHttpRequest获取和解析JSON对象,但它总是失败并导致空引用 function getJSON(target = null) { var response_data = []; var target_url = target; var xhr = new XMLHttpRequest();

我试图在Javascript中使用XMLHttpRequest获取和解析JSON对象,但它总是失败并导致空引用

            function getJSON(target = null)
            {
                var response_data = [];
                var target_url = target;
                var xhr = new XMLHttpRequest();
                xhr.open('GET', target_url, true);
                xhr.setRequestHeader('Content-Type', 'application/json');
                xhr.send();
                xhr.addEventListener("readystatechange", function ()
                {
                  if(xhr.readyState === 4)
                  {
                     if(xhr.status >= 200 && xhr.status < 304)
                     {
                        response_data += xhr.response;
                     }
                     else
                     {
                        response_data += $.getJSON(target_url);
                        console.log('[XHR-DEBUG]: Unexpected HTTP response code: ' + xhr.status + ': ' + xhr.statusText + '(' + target_url + ')');            
                     }
                  }
                });
                return JSON.parse(JSON.stringify((typeof response_data === 'undefined' || response_data === null || response_data.toString().split(',').length <= 1 ? xhr.response : response_data)));
            }
预期结果:


   ["John eaten the cake","Stackoverflow is awesome"]
当前结果:

   ""

您使用了异步
XMLHttpRequest
。因此,问题在于以下几行:

return JSON.parse(JSON.stringify((typeof response_data === 'undefined' || response_data === null || response_data.toString().split(',').length <= 1 ? xhr.response : response_data)));
或使用异步/等待:

async function getJSON(target = null)
    {
        var response_data = [];
        var target_url = target;
        var xhr = new XMLHttpRequest();
        xhr.open('GET', target_url, true);
        xhr.setRequestHeader('Content-Type', 'application/json');
        await new Promise((resolve,reject)=>{
            xhr.addEventListener("readystatechange", function ()
            {
              if(xhr.readyState === 4)
              {
                 if(xhr.status >= 200 && xhr.status < 304)
                 {
                    response_data.push(xhr.response);
                 }
                 else
                 {
                    response_data.push(await getJSON(target_url));
                    console.log('[XHR-DEBUG]: Unexpected HTTP response code: ' + xhr.status + ': ' + xhr.statusText + '(' + target_url + ')');            
                 }
                 resolve()
              }
            });
            xhr.send()
        });
        return JSON.parse(JSON.stringify((typeof response_data === 'undefined' || response_data === null || response_data.length <= 1 )? xhr.response : response_data));
    }
异步函数getJSON(target=null) { var响应_数据=[]; var target_url=target; var xhr=new XMLHttpRequest(); xhr.open('GET',target\u url,true); setRequestHeader('Content-Type','application/json'); 等待新的承诺((决定,拒绝)=>{ xhr.addEventListener(“readystatechange”,函数() { if(xhr.readyState==4) { 如果(xhr.status>=200&&xhr.status<304) { 响应\数据推送(xhr.响应); } 其他的 { response_data.push(等待getJSON(target_url)); console.log('[XHR-DEBUG]:意外的HTTP响应代码:'+XHR.status+':'+XHR.statusText+'('+target_url+')); } 解决() } }); xhr.send() }); 返回JSON.parse(JSON.stringify((typeof response_data=='undefined'| | response_data===null | | response_data.length
xhr.open('GET',target_url,false)
async function getJSON(target = null)
    {
        var response_data = [];
        var target_url = target;
        var xhr = new XMLHttpRequest();
        xhr.open('GET', target_url, true);
        xhr.setRequestHeader('Content-Type', 'application/json');
        await new Promise((resolve,reject)=>{
            xhr.addEventListener("readystatechange", function ()
            {
              if(xhr.readyState === 4)
              {
                 if(xhr.status >= 200 && xhr.status < 304)
                 {
                    response_data.push(xhr.response);
                 }
                 else
                 {
                    response_data.push(await getJSON(target_url));
                    console.log('[XHR-DEBUG]: Unexpected HTTP response code: ' + xhr.status + ': ' + xhr.statusText + '(' + target_url + ')');            
                 }
                 resolve()
              }
            });
            xhr.send()
        });
        return JSON.parse(JSON.stringify((typeof response_data === 'undefined' || response_data === null || response_data.length <= 1 )? xhr.response : response_data));
    }