2012-02-03 9 views
1

関数内でajaxリクエストを実行したいとします。基本的に...

function doIt(id) { 
    var myVar; 
    $.ajax({ 
     ... url etc... 
     success: function(result) { 
      myVar = "Some stuff" + result; 
      console.log(myVar); 
     } 
    }) 
    return myVar; 
} 

しかし、成功したときにログオンすると、myvarは設定されていません。関数でその変数を再取得させるにはどうすればよいですか?

+0

"結果"をログに記録してください。 –

答えて

2

$.ajaxは非同期です。つまり、次の行が実行される前に終了しません。何が起きているのは、successイベントトリガーの前にreturn myVar;が実行されているということです。

asyncプロパティをオフにし

、それは表面的問題解決します。ただし

function doIt(id) { 
    var myVar; 
    $.ajax({ 
     ... url etc..., 
     async: false, 
     success: function(result) { 
      myVar = "Some stuff" + result; 
      console.log(myVar); 
     } 
    }) 
    return myVar; 
} 

、お使いのブラウザハングになりますので、これにアプローチする最良の方法は、successイベントの内部ですべての処理を置くことです。それが起こるよう

function doIt(id) { 
    var myVar; 
    $.ajax({ 
     ... url etc..., 
     async: false, 
     success: function(result) { 
      myVar = "Some stuff" + result; 
      console.log(myVar); 
      // TODO: Everything related to `myVar` here. 
     } 
    }) 
} 
+0

@justing、async falseは、ユーザーが終了するまでユーザーをブロックしないため、幸いではありません。 – kobe

+1

これは、リクエストが完了するまでブラウザがハングアップするので、一般的にはひどい考えです。これを行うにはいくつかの理由がありますが、良いものはあまりありません。 –

+0

'async:false'は呼び出しが完了するまでブラウザをロックします。私はこれをしないことをお勧めします。代わりに 'myVar'値の使い方を変更することをお勧めします。 –

3

AJAX呼び出しは並列それはあなたがあなたがあなたができないことを var myVar;

function doIt(id) { 

    $.ajax({ 
     ... url etc... 
     success: function(result) { 
      myVar = "Some stuff" + result; 
      console.log(myVar); 
      // do your logic here after the ajax success 
     } 
    }) 
} 
2

のような値を返すことはできません

結果を取得されていません理由は、aysncですAJAX呼び出しから値を返します。それは非同期です。 AJAX呼び出しが終了する前にreturnが実行されます。

コールバック内でmyVarのすべてのロジックを実行する必要があります。

関連する問題