2012-01-27 15 views
7

私は機能を持っている:AJAXはf1dataを取得した後リターン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を返すことができますか?

+0

どこに送付しますか?それは重要な質問です – Baz1nga

+0

それは** A ** JAXですコールバック関数を使用してコードを動作させる必要があります。 –

答えて

15

リクエストが非同期で、同期Ajaxリクエストがの恐ろしいアイデアなので、リクエストの結果を返すことはできません。そして、あなたはこのようなf1を呼びたい

あなたの最善の策は、F1

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

に独自のコールバックを渡すことになります。

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をグローバルにしていますが、タイミングの問題が発生する可能性があります。

のいずれかへのより良い:Ajaxの成功に実行されるコールバックで

  1. パス、または
  2. 使用jQueryの.when/.then construct、または
  3. ただ、コールバックでの作業を行います。
  4. (うん、あなたはコールの同期を行うことができます。しないでください。)
0

これを行う最も簡単な方法は、AJAX呼び出しの同期を行うことです。あなたのf1関数の意味は、呼び出しが完了してデータが返されるまで関数が動かないように、async:falseを使ってajax呼び出しを設定します。

0

あなたはajaxコールを同期させる必要があるようです。

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

この方法JSの実行が呼び出しが戻るとsuccess機能が実行されるまで一時停止します:あなたはこのようなことを行うことができます。

もちろん、同期呼び出しの問題があります。 successコールバックでa変数を使用して行う必要があるように、コードをリファクタリングするのが最適です。

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" 
} 

だから、あなたの成功の機能は次のようになります。

このアイデアに

ビル、あなたのf3関数は次のようなものだったと仮定

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

これは明らかです。