Вернуть данные $ .get в функцию, используя jQuery - PullRequest
33 голосов
/ 28 октября 2009

Я пытаюсь вызвать функцию, которая содержит код jQuery. Я хочу, чтобы эта функция возвращала результаты оператора jQuery. Это не работает, и я пытаюсь выяснить, почему.

function showGetResult (name) {
    var scriptURL = "somefile.php?name=" + name;
    return $.get(scriptURL, {}, function(data) { return data; });
}

alert (showGetResult("John"));

В предупреждении отображается «[object XMLHttpRequest]». Однако, если я запускаю оператор jQuery сам, вне функции, он работает нормально -> $.get(scriptURL, {}, function(data) { alert(data); })

Я хотел бы иметь возможность повторно использовать этот код, поместив его в функцию, которая возвращает данные $.get. Какую фундаментальную ошибку я здесь совершаю?

Ответы [ 6 ]

93 голосов
/ 28 октября 2009

У вас есть несколько разных ошибок. Во-первых, $ .get не возвращает возвращаемое значение функции обратного вызова. Возвращает объект XHR. Во-вторых, функция get не является синхронной, она асинхронная, поэтому showGetResult, вероятно, вернется до завершения get. В-третьих, вы не можете вернуть что-то из обратного вызова во внешнюю область. Однако вы можете привязать переменную во внешней области и установить ее в обратном вызове.

Чтобы получить желаемую функциональность, вам нужно будет использовать $ .ajax и установить для параметра async значение false. Затем вы можете определить переменную во внешней области видимости и назначить ее в обратном вызове ajax, возвращая эту переменную из функции.

function showGetResult( name )
{
     var result = null;
     var scriptUrl = "somefile.php?name=" + name;
     $.ajax({
        url: scriptUrl,
        type: 'get',
        dataType: 'html',
        async: false,
        success: function(data) {
            result = data;
        } 
     });
     return result;
}

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

9 голосов
/ 28 октября 2009

Основная ошибка, которую вы делаете, заключается в том, что вызов AJAX выполняется асинхронно, поэтому к тому времени, когда вы вернетесь, результат еще не готов. Чтобы это работало, вы можете изменить свой код следующим образом:

$(function() {
    showGetResult('John');
});

function showGetResult (name) {
    $.get('somefile.php', { 
        // Pass the name parameter in the data hash so that it gets properly
        // url encoded instead of concatenating it to the url.
        name: name 
    }, function(data) { 
        alert(data); 
    });
}
6 голосов
/ 28 октября 2009

Похоже, вы хотите синхронный запрос: Как заставить jQuery выполнять синхронный, а не асинхронный Ajax-запрос?

Или, возможно, вы захотите передать обратный вызов вашей функции:

function showGetResult (name, callback) {
  var scriptURL = "somefile.php?name=" + name;
  return $.get(scriptURL, {}, callback);
}

showGetResult("John", function(data){ alert(data); });
2 голосов
/ 28 октября 2009

Основной ошибкой является «асинхронная» часть AJAX. Поскольку вы не знаете, сколько времени потребуется серверу для отправки ответа, методы AJAX никогда не блокируются, то есть вы не вызываете сервер и просто сидите и ждете результата. Вместо этого вы переходите к чему-то другому, но вы устанавливаете метод, называемый «обратный вызов», который будет срабатывать при возвращении результатов. Этот метод отвечает за то, что нужно делать с данными (например, вставлять их на страницу).

1 голос
/ 28 октября 2009

Это неправильный способ сделать. Функция (data) является функцией обратного вызова, поэтому всякий раз, когда return $ .get будет выполняться .. существует вероятность, что функция обратного вызова не была бы вызвана.

Лучше вы вызываете функцию получения данных поста из метода function (data).

0 голосов
/ 19 февраля 2019

Эффективным способом является использование метода DeQred в jQuery, который синхронизирует / асинхронные запросы к серверу и ожидает deferred.resolve (), а затем возвращает объект отложенного обещания. Выглядит немного утомительно, но небольшое исследование, безусловно, полезно для больших данных. (функция tvanfosson хорошо работает в этом случае, но когда я работал над данными Google Analytics, большое количество информации сводило меня с ума, и поэтому мне нужно найти это решение)

     function showResults(name) { 
        var deferred = $.Deferred, requests = [];

        requests.push($.ajax({url:"/path/to/uri/?name=" + name, type: "GET", async: false}).done(function(d) { 
         //alert or process the results as you wish 
        }));
        $.when.apply(undefined, requests).then(function() { deferred.resolve(); }); 
        return deferred.promise();

    }

возвращенный объект обещания также можно использовать с $.when(showResults('benjamin')).done(function() { }); для изменений после публикации (например, настройки графика / графика и т. Д.). полностью многоразовый. Вы также можете поместить эту функцию в цикл запросов $ .deferred, например,

        function updateResults() { 
             var deferred = $.Deferred, requests = [];
             requests.push($.ajax(url:"/path/to/names/?nameArr=" + jsonArrOfNames, type: "GET", async: false}).done(function(res) {  requests.push(showResults(res[0]));}) );
             $.when.apply($, requests).then(function() { deferred.resolve(); }); 
             return deferred.promise();
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...