jQuery AJAX запрос get не работает нормально, и возвращаемое значение не может быть отображено в консоли - PullRequest
0 голосов
/ 28 января 2020

Я новичок в jQuery и пытаюсь что-то построить с AJAX. Я попытался использовать обычный, базовый c класс XMLHttpRequest, а затем $.ajax({...}) but none of them work.</p> <pre><code>function getNormal_XHR_Request(){ let request = new XMLHttpRequest(); // I also tried to make a variable here, assign it to the request.response and return it in the end let returnValue = null; request.addEventListener( "load", (event) => { if(request.readyState === 4 && request.status === 200){ console.log(request); // this will work console.log(request.response); // this will work too // Assign the returnValue to the request.response returnValue = JSON.parse(request.response); // JSON.parse(request.response) doesn't return undefined, it returns my object that I want to use, but even if I equal the returnValue to it, it will still return undefined return JSON.parse(request.response); } }, false // dispatch event in the bubbling phase not in the capturing phase ) request.open("GET", "scripts/users.json"); request.setRequestHeader("Accept", "text/json"); request.send(); return returnValue }

Это обычный XMLHttpRequest (), который я использовал. Проблема в том, что если я хочу сказать, например,

x = getNormal_XHR_Request()

, чтобы в моей переменной x был файл JSON, он не работает и возвращает неопределенное значение.

И то же самое происходит с $.ajax({...})

class XHR_REQUEST{
    constructor(path){
        this.path = path;
    }
    getRequest_XHR(requestHeaders){
        this.requestHeaders = requestHeaders;

        var self = this;
        let returnValue = [];

        $.ajax({
            url : self.path,
            dataType : "json",
            headers : self.requestHeaders, 
        })
        .done((data) => {
            returnValue = data;
        })
        .fail((jqXHR, errorMessage, error) => {
            console.log(jqXHR);
            console.log(errorMessage);
            console.log(error);
        });

        return returnValue;
    }
};
</code>

Она работает так же, как обычная функция, которую я использовал выше, все, что я делаю, возвращает неопределенное значение, даже если request.response дает мне правильный ответ. Если я попытаюсь console.log (request.response), я получу объект, если я попытаюсь вернуть его и console.log () результат, он вернет мне неопределенный. Почему?

1 Ответ

1 голос
/ 28 января 2020

Результат, который вы получаете в обоих примерах, совершенно нормален. Причина, по которой вы получаете значение undefined, заключается в том, что оба запроса происходят асинхронно . Правильное место, где можно что-то вернуть или предпринять какое-либо действие с полученными результатами:

1) request.addEventListener('load', event => {} .... в рамках события вы можете выполнить действие для успешного ответа.

2 ) с вызовом $.ajax() вы делаете это в обработчике обещаний done().

Это подходящие места для принятия надлежащих мер в отношении результатов. Вы должны изменить свое мышление, чтобы начать использовать ответы от асинхронных обратных вызовов.

Проблема в том, что вы возвращаете результат, даже до того, как обратный вызов имеет какое-либо значение, заполненное переменной.

В наши дни появились новые конструкции, позволяющие асинхронным вызовам вести себя синхронно с async-await конструкциями. Но помимо этого, я думаю, вам нужно изменить или настроить свой код, чтобы он реагировал на асинхронные результаты c так, как он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...