Возвращает $.получает данные в функции с помощью jQuery

StackOverflow https://stackoverflow.com/questions/1639555

  •  08-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь вызвать функцию, которая содержит код 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 данные.Какую фундаментальную ошибку я здесь совершаю?

Это было полезно?

Решение

У вас есть несколько разных ошибок. Во-первых, $ .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;
}

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

Другие советы

Основная ошибка, которую вы делаете, заключается в том, что вызов 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); 
    });
}

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

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

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

showGetResult("John", function(data){ alert(data); });

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

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

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

Эффективным способом является использование отложенного метода jQuery, как для синхронизации / асинхронных запросов к серверу, так и для ожидания deferred.resolve(), а затем возврата объекта deferred promise.Выглядит немного утомительно, но небольшое исследование, несомненно, полезно для обработки больших объемов данных.(функция 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();

    }

возвращенный объект 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();
            }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top