Могу ли я вернуть данные из анонимной функции обратного вызова в jQuery? - PullRequest
1 голос
/ 01 октября 2010

Я уверен, что это просто, но я запутался в проблеме с областью видимости в Javascript.Я делаю следующее:

$.get(url, function (data){console.log(data);});

Эта часть работает нормально - я вижу нужную строку в консоли.Но на самом деле я хочу взять эту переменную данных и поместить ее в строку.Примерно так (не работает):

string = $.get(url, function (data){return data;});

Это дает string значение [object XMLHttpRequest].

Чего мне не хватает?

Упс

Да, мне не хватает того факта, что Ajax, как следует из названия, является асинхронным.Спасибо, что дали мне пощечину по лбу, в которой я нуждался, все.

Послесловие

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

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

Что (надеюсь) показывает, что я все-таки не идиот.:)

Ответы [ 6 ]

3 голосов
/ 01 октября 2010

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

То, что вы не можете сделать, это передать это значение из функции обратного вызова в присвоение в окружающей функции, и причина, по которой вы не можете этого сделать, заключается в том, что это будет путешествие во времени. Метод get() мгновенно возвращается, начиная с HTTP-запроса в фоновом режиме, который будет выполнен позже. Когда это происходит, вызывается функция обратного вызова, но к этому времени string уже давно назначено.

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

function getThing(callback) {
    ...
    $.get(url, function(data) {
        callback(data);
    });
}

Альтернатива состоит в том, чтобы делать все синхронно, используя async: false. Но это плохая новость для всех, так как веб-браузер зависает до тех пор, пока запрос не будет выполнен.

3 голосов
/ 01 октября 2010

.get() отправляет HTTP-запрос AJAX GET и возвращает немедленно, означая, что вы не можете присвоить результат переменной просто потому, что результат доступен только в обратном вызове успеха (анонимная функция, которую вы передаете каквторой аргумент).В этом обратном вызове вы можете вызывать другие функции и передавать данные как переменные.Вот как работает AJAX.A означает асинхронный.

1 голос
/ 01 октября 2010

Ajax-запросы выполняются асинхронно 1 , последний аргумент ajax-функций JQuery - обратный вызов. Чтобы ответить, почему ваш второй пример не работает, вам нужно понять асинхронные обратные вызовы . Альтернативно, это похоже на шаблон наблюдателя, где observable - это запрос Ajax, а observer - обратный вызов. Шаги для выполнения запроса (приблизительно):

  1. создать объект XmlHttpRequest
  2. создайте запрос и отправьте его
  3. ждать ответа
  4. получить ответ (там разные состояния)
  5. обработка ответа
  6. Уведомление об обратном вызове

Аргумент data в обратном вызове приходит на шаге 6, а вызов $.get() возвращается на шаге 2. Таким образом, ваши данные недоступны. Вам нужно установить данные на шаге 6 в некоторой переменной и обработать их оттуда.


1 запросы могут выполняться синхронно, однако A в Ajax означает Asynchronous . Можно использовать $.get() для выполнения синхронизированного запроса, но технически его нельзя назвать «Ajax». Моя точка зрения.

0 голосов
/ 01 октября 2010

Это то, что вы пытаетесь:

var data = $.get(url, function(data){return data;});
// trying to do the stuff you want to do with data

Это то, что вам нужно сделать:

$.get(url, function(data){
    // do the stuff you want to do with data
});
0 голосов
/ 01 октября 2010

Вы можете сделать одну из двух вещей:

1 - измените ваш GET на синхронный с {async: false }, для этого вам может понадобиться метод $ .ajax. затем присвойте переменную в обратном вызове успеха.

2 - поместите все, что у вас есть, используя переменную в обратном вызове успеха.

$.get(url, function (data){
    var string = data;
    useMyString(string);
});
0 голосов
/ 01 октября 2010

данные var, передаваемые вашей анонимной функции, являются самим объектом ajax. Если вы хотите вернуть текст ответа с сервера, вы должны сделать что-то вроде этого:

$.get(url, 
    // data to send
    {
      'foo' : 'bar'
    },
    // receive response
    function(response){
      return response;
    } // response callback function
); // .get()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...