2016-04-20 14 views
1

私のデータを外部変数に戻すことに問題があります。私は、アヤックスのリクエストはうまく動作しますが、私が必要とする方法でそれを渡していないことを知っています。ここajaxリクエスト後に変数にデータを渡す

は私のクラスでの正確な方法である

function(amount,symbol=''){ 
 
\t \t \t var current_rate = ''; 
 
\t \t \t var url = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D'https%3A%2F%2Fwww.google.com%2Ffinance%2Fconverter%3Fa%3D"+ amount +"%26from%3DNGN%26to%3D"+ symbol +"'%20and%20xpath%3D'%2F%2Fdiv%5B%40id%5D'&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"; 
 
\t \t \t 
 
\t \t \t var get_rate = $.ajax({ 
 
\t \t \t url: url, 
 
\t \t \t method: "GET" 
 
\t \t \t }).complete(function(data){ 
 
\t \t \t \t current_rate = data.responseJSON.query.results.div.span.content; 
 
\t \t \t }).fail(function(jqXHR, textStatus) { 
 
\t \t \t \t alert("Request failed: " + textStatus); 
 
\t \t \t }); 
 
\t \t 
 
\t \t \t return current_rate; 
 
\t \t }

アイブ氏は、簡略化のためのコードを編集しました。完全なスクリプトheres。リクエストからのデータを 'Current_rate'変数に戻す方法を知っておく必要があります

+0

Ajaxは非同期呼び出しです...したがって、現在のレートはdone/failが呼び出されるより速く返されます。追加current_rateは範囲外です。私は推測します。あなたはajaxを同期的に呼び出すことができるいくつかのトリックを作ります..ここのようにhttp://stackoverflow.com/questions/6685249/jquery-performing-synchronous-ajax-requestsしかし、私はお勧めしませんそれは..あなたのコードを書き換える方が良いです... – Maxim

答えて

0

current_rate = ''は、関数が終了するとcurrent_rateの値になるため、関数はcurrent_rate = ''を返します。の前にが終了し、非同期呼び出しが完了しました!

この部分:

$.ajax({ 
    url: url, 
    method: "GET" 
}).complete(function(data){ 
    current_rate = data.responseJSON.query.results.div.span.content; 
}) 

は長いあなたの関数が戻った後になりますcurrent_rateときAJAX呼び出しのリターンを、設定します。 $.ajax()というスケジューリング(要求が完了したときに実行されるコード)と考える必要があります。それはブロックされたり、それが起こるのを待ったりすることはありません。これを使用するためには

function(amount,symbol=''){ 
      var url = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D'https%3A%2F%2Fwww.google.com%2Ffinance%2Fconverter%3Fa%3D"+ amount +"%26from%3DNGN%26to%3D"+ symbol +"'%20and%20xpath%3D'%2F%2Fdiv%5B%40id%5D'&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"; 

      return $.ajax({ 
       url: url, 
       method: "GET" 
      }); 
     } 

は、このような関数を呼び出します:

ここに最善の解決策は、関数を呼び出すので、あなたの$.ajax()戻ると、それを待つことができるという約束を返すことです

get_current_rate(1000,'CAD').complete(function(data) { // do something with the returned data }); 

jQuery Deferred objectのドキュメントを参照してください。 How do I return the response from an asynchronous call?

+1

[遅れた反パターン]を避けてください(http://stackoverflow.com/q/23803743/1048572)! – Bergi

+0

@Bergiありがとう、私は今日何かを学んだ! –

関連する問題