Возвращает $.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
. Какую фундаментальную ошибку я здесь делаю?
Ответы
Ответ 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, существует вероятность того, что функция обратного вызова не была бы вызвана.
Лучше вы вызываете свои данные после получения данных из метода функции (данных).