Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Чтобы получить нужную функциональность, вам нужно использовать $.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;
}

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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