2012-01-27 2 views
7

Например у меня есть функция:вернуть AJAX обратного возврата

var f1 = function(arg) { 
    var a; 
    $.ajax({ 
     ... 
     success: function(data) { 
      a = f2(data); 
      //return a; 
     } 
    }); 
    //return a; 
} 

var f3 = function() { 
    a = f1(arg); 
} 

Как я могу вернуть a после AJAX получить data в f1?

+0

, куда вы хотите отправить. это важный вопрос – Baz1nga

+0

Это ** A ** JAX ...вам нужно сделать свой код, используя функции обратного вызова. –

ответ

15

Вы не можете вернуть результат своего запроса ajax, так как запрос является асинхронным (а синхронные запросы ajax - это ужасная идея).

Лучше будет пройти свой собственный обратный вызов в f1

var f1 = function(arg, callback) { 
    $.ajax({ 
     success: function(data) { 
      callback(data); 
     } 
    }); 
} 

Тогда вы назвали бы f1 так:

f1(arg, function(data) { 
      var a = f2(data); 
      alert(a); 
     } 
); 
+0

замечательный ответ – merveotesi

+0

Что представляет f2? возможно, обратный вызов? – Rodent

+0

Все в порядке, это объясняет это: http://stackoverflow.com/questions/14754619/jquery-ajax-success-callback-function-definition – Rodent

2

Короткий, простой ответ: вы не можете.

Вы можете сделать a глобальным, но вы подвержены вопросам сроков.

Лучше либо:

  1. Pass в функции обратного вызова для запуска в успехе Ajax или
  2. Использование JQuery-х .when/.then construct или
  3. Просто сделать работу в функции обратного вызова.
  4. (Да, вы можете сделать вызов синхронным. Пожалуйста, не.)
0

Самый простой способ сделать это, чтобы сделать синхронный вызов Ajax. Значение в вашей функции f1 устанавливает ajax-вызов с асинхронным: false, чтобы функция не двигалась до завершения вызова и возвращаемых данных.

0

Вам, похоже, нужно сделать синхронный вызов ajax. Вы можете сделать это так:

$.ajax({ 
    ... 
    async: false, 
    success: ... 
}); 
return a; 

Таким образом, выполнение JS не остановится до возвращения вызова и функция success работает.

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

Основываясь на этой идее, предположим, что ваша f3 функция была что-то вроде этого:

var f3 = function() { 
    a = f1(arg); 
    alert(a); //i.e. "do something" with "a" 
} 

Вы могли бы сделать это вместо:

var f3 = function() { 
    f1(arg); 
} 
var f3_callback = function(a) { 
    alert(a); //i.e. "do something" with "a" 
} 

Таким образом, ваша функция успеха будет выглядеть следующим образом:

success: function(data) { 
    a = f2(data); 
    f3_callback(a); 
} 

Надеюсь, это ясно!