2012-12-29 3 views
0

У меня проблема с возвратом данных из ajax в функцию вызывающего абонента. Когда я консолью, это не определено.Данные, возвращающиеся из функции, не определены

Я считаю, что моя проблема возникает из-за того, что js является асинхронным, и когда я консолью, данные из него еще не готовы. Что я могу сделать, чтобы решить эту проблему?

FooFunction: function(userInput){ 

    var fooData = FooFunction2(userInput); 
    console.log(fooData);  // <--- undefined 
}, 

FooFunction2: function(userInput) { 

    $.ajax({ 
     url:'./php/test.php', 
     type:'post', 
     dataType:'json', 
     data:{ 
      fooData: userInput 
     }, 
     success:function(data) { 
      ...manipulating the data... 

      console.log(manipulatedData); // <--- ['foo', 'foo2']; 
      return manipulatedData; 
     } 
    }); 
}, 
+0

Пожалуйста, показать то, что 'console.log (данные),' шоу. – AlecTMH

+0

откуда он и где определено ** userInput ** ?? вы ничего не говорите с этим примером, вы должны проверить, где это начинается var – sbaaaang

ответ

2

вызов Ajax является асинхронной, поэтому возвращение не будет работать. Измените свой код, чтобы использовать обратный вызов, который вызывается при завершении вызова ajax.

Я изменил свой код, чтобы сделать это:

FooFunction: function(userInput){ 
    var callbackfunc = function(ajaxData) 
    { 
     console.log(ajaxData); //ajax is complete! 
    }; 

    this.FooFunction2(userInput, callbackfunc); 
}, 

FooFunction2: function(userInput, callbackfunc) { 

    $.ajax({ 
     url:'./php/test.php', 
     type:'post', 
     dataType:'json', 
     data:{ 
      fooData: userInput 
     }, 
     success:function(data) { 
      ...manipulating the data... 

      console.log(manipulatedData); // <--- ['foo', 'foo2']; 
      callbackfunc(manipulatedData); 
     } 
    }); 
}, 
1

FooFunction2 является свойством объекта использования this.FooFunction2

и вы не можете вернуться из асинхронных методов. либо выполнить синхронный вызов ajax, либо обратный вызов proivde.

FooFunction: function(userInput){ 

    var fooData = this.FooFunction2(userInput); 
    console.log(fooData);  // <--- undefined 
}, 

Модифицированный код

FooFunction: function(userInput){ 

    this.FooFunction2(userInput, function(fooData){ 
      console.log(fooData);  // <--- undefined 
    }); 

}, 

FooFunction2: function(userInput, cb) { 

    $.ajax({ 
     url:'./php/test.php', 
     type:'post', 
     dataType:'json', 
     data:{ 
      fooData: userInput 
     }, 
     success:function(data) { 
      ...manipulating the data... 

      console.log(manipulatedData); // <--- ['foo', 'foo2']; 
      cb(manipulatedData); 
     } 
    }); 
}, 
+0

@undefined: Да. Способ решения неспособности вернуться из асинхронной функции заключается в использовании обратного вызова вместо этого. – Eric

Смежные вопросы