2011-01-20 3 views
3

このコードをラップすると、関数呼び出しがjsonオブジェクトのcontianing変数を返すようにすることができますか?jquery関数をラップして値を返す

例:

function GetNewSomething() { 
     var newtb = 0; 
     $.get("/something/new", 
       function (data) { 
        newtb = data; 
       } 
       ); 
     return newtb; // as of now this always returns undefined... 
    } 

は事前みんなで..

感謝をこの方法を試してみましたが、唯一undefinedを返します!

について、

答えて

6

できません。 Ajax呼び出しは非同期です。

function GetNewSomething(cb) { 
    $.get("/something/new", cb); 
} 

としてそれを呼び出す:あなたはあなたの関数へのコールバックを渡す必要があり

GetNewSomething(function(data) { 
    // do something with data 
}); 

I wrote something about it

回答がJSON文字列の場合は、.getJSONを使用してレスポンスをJavaScriptオブジェクトにデコードすることもできます。

+0

「私たちはあなたに電話しない、愛する」 – Maher4Ever

0

$.getは非同期です。これは、get要求が戻ったときに呼び出す関数を渡す理由です。

3

.get()は、$.ajax()のラッパーです。明示的に構成されていない場合、すべてのAJAX要求はasyncronouslyで実行されます。つまり、$.get()が完了する前にreturn newtb;ステートメントが実行されます。

この問題を回避するには、自分で別のコールバックを呼び出すことをお勧めします。これは、次のようになります。

function GetNewSomething(callback) { 
    $.get("/something/new", 
      function (data) { 
       if(typeof callback === 'function') 
        callback.apply(this, [data]); 
      } 
      ); 
} 

そして$.get$.ajaxための単なるラッパーであるため、あなたは$.get$.ajaxを作り、それをsyncronousにするために変更される可能性

GetNewSomething(function(data) { 
    // do something with data 
}); 
0

のようにそれを呼び出す:

function GetNewSomething() { 
     var newtb = 0; 
     $.ajax({url:"/something/new", 
       type:"GET", 
       async:false, 
       success: function (data) { 
        newtb = data; 
       } 
      }); 
     return newtb; 
    } 
+0

はい、理論的には可能ですが、ほとんどの場合は悪い考えです。答えを得るのにどれくらいの時間がかかるかによって、これはすべてのパフォーマンスとユーザビリティを殺します。 –

+0

あなたが「async:false」を避けていることを知っていない限り、 – Raynos

+0

@Felix Kling - 私は同意し、あなたの方法はこのシナリオでそれを行う適切な方法です。私はそれができる別の方法を供給していただけだった。また、この呼び出しが唯一の処理であるかどうかによって、$ .getが完了してコールバックにヒットするまで、処理が停止されたように見えます。再度それはシナリオに依存します。 – amurra

関連する問題