Donnie N.I Ответов: 1

Как сохранить ajax-ответ в глобальную переменную для повторного использования


Как я могу сохранить ajax-ответ на глобальную переменную в javascript/jquery для последующего использования? Я попробовал несколько методов, включая сохранение текста ответа (data.responseText), возвращенного из вызова, но в конце он все еще пуст/неопределен.

Я знаю, что сохранение ответа в элементе DOM настоятельно не рекомендуется.Я не хочу делать один и тот же звонок каждый раз, когда мне нужны эти конкретные данные. Неужели нет простого способа получить к нему доступ за пределами функции обратного вызова ajax success?

Что я уже пробовал:

var jsonResponse = $.ajax({
                url: 'PageMethod/GetData',
                method: 'post',
                dataType: 'json',
                data: JSON.stringify({ dataId: "xxx" }),
                contentType: 'application/json',
                success: function (data) {
                    
                    // not sure if i should return the data here on at end of the ajax call definition
                    return data.d.responseText;
                },
                error: function (ex) {
                    alert(ex.responseText);
                }
            }).responseText;

            alert(jsonResponse);

1 Ответов

Рейтинг:
11

F-ES Sitecore

Основная (но не единственная) причина, по которой ваш код не работает, заключается в том, что вызов ajax является асинхронным, что фактически означает, что он происходит в фоновом режиме или параллельно с остальной частью кода. Таким образом, выполнение кода не останавливается на вызове ajax и не ждет ответа, поэтому вы вызываете ajax, который срабатывает и делает свое дело, ваш код затем переходит к оповещению, но вызов ajax еще не завершен.

Вы можете заставить ajax ждать ответа, прежде чем продолжить, добавив "async:false" в качестве опции к вызову, но это обычно не требуется. Чтобы сохранить результат, вы должны сделать что-то вроде

var myResponse;
$.ajax({
                url: 'PageMethod/GetData',
                method: 'post',
                dataType: 'json',
                data: JSON.stringify({ dataId: "xxx" }),
                contentType: 'application/json',
                success: function (data) {
                    myResponse = data.d.responseText;
                },
                error: function (ex) {
                    alert(ex.responseText);
                }
            });


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