Не удалось при попытке получить объект JSON с использованием XMLHttpRequest, что привело к пустой цитате - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь выбрать и проанализировать JSON-объект, используя XMLHttpRequest в Javascript, но он всегда завершается ошибкой и приводит к пустой цитате ...

            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)));
            }

Использование:

   getJSON('localhost/logs.json');

Ожидаемый результат:


   ["John eaten the cake","Stackoverflow is awesome"]

Текущий результат:

   ""

1 Ответ

0 голосов
/ 13 января 2019

Вы использовали асинхронный XMLHttpRequest. Итак, проблема в следующей строке:

return JSON.parse(JSON.stringify((typeof response_data === 'undefined' || response_data === null || response_data.toString().split(',').length <= 1 ? xhr.response : response_data)));

Это находится вне слушателя события, и данные не доступны, когда эта строка выполняется.

Чтобы это работало, используйте синхронный XMLHttpRequest (не рекомендуется):

xhr.open('GET',target_url,false)

Или используйте async / await:

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));
    }

Смотри также:

Асинхронная функция
Promise
Ожидать оператора

Я надеюсь, что это поможет вам!

...