2016-05-07 13 views
0

私は完全なJSのnoobです。関数間にjavascript変数を渡します

yahooの株価を照会するシンプルなJSがありますが、それは何らかの理由で結果変数を別の関数に渡すことができません。そこで別の計算を実行したいと思います。ここに簡略版を貼り付けました。

誰かが私がそれを感謝するのを助けることができたら、私はこれを、すべての朝に把握できませんでした。 :(

ありがとう!

var result = "0"; 
 

 
function onBodyLoad(){ 
 

 
getQuote(); 
 
    
 
var balance = "100"; 
 
var leverage = balance/result; 
 
    
 
$("#leverage_result").text(leverage); 
 
    
 
} 
 

 
function getQuote(){ 
 

 
    var url = "http://query.yahooapis.com/v1/public/yql"; 
 
    var symbol = $("#symbol").val(); 
 
    symbol = "^GSPC"; 
 

 
    var data = encodeURIComponent("select * from yahoo.finance.quotes where symbol in ('" + symbol + "')"); 
 
    
 
    $.getJSON(url, 'q=' + data + "&format=json&diagnostics=true&env=http://datatables.org/alltables.env") 
 
     .done(function (data) { 
 
     result = parseInt(data.query.results.quote.LastTradePriceOnly); 
 
    }); 
 
    
 
}
<body onload="onBodyLoad()"> 
 
<div id='leverage_result'>No Price</div> 
 
</body>

+0

まあ、それは、私は2番目の関数では、そのgetJSON呼び出しの外に表示することはできません結果変数を格納する方法の周りに混乱があるはずです。 – alfa8884

答えて

0

それが同期であるかのようにあなたが非同期コードを処理しているので、あなたがここに壁に頭を強打している。あなたは、コード$.getJSONを行うとしたがって、onBodyLoad関数では、getQuoteの後の行は、すぐにの行で実行され、発行されたリクエストから結果が到着した後ではありませんgetQuoteファンクション内にあります。

何がやりたいことは、サーバーから戻って結果を取得した後、あなたのコードを実行されるため、コールバックを使用することができます。何が起こっている

function onBodyLoad(){ 

    getQuote(function(result) { 
     var balance = "100"; 
     var leverage = balance/result; 

     $("#leverage_result").text(leverage);    
    }); 

} 

function getQuote(callback){ 

    var url = "http://query.yahooapis.com/v1/public/yql"; 
    var symbol = $("#symbol").val(); 
    symbol = "^GSPC"; 

    var data = encodeURIComponent("select * from yahoo.finance.quotes where symbol in ('" + symbol + "')"); 

    $.getJSON(url, 'q=' + data + "&format=json&diagnostics=true&env=http://datatables.org/alltables.env") 
    .done(function (data) { 
     result = parseInt(data.query.results.quote.LastTradePriceOnly); 

     callback(result); 
    }); 

} 

が、私はその匿名関数を作成していますということです唯一のパラメータとしてresultを受け取り、リモートサーバーからデータを受け取った後に必要な操作を行います。この関数はgetQuote関数に渡され、$.getJSONが完了した後にのみ呼び出されます。より洗練されたソリューションは、約束を使用することですが、これはあなたに行く必要があります。

ああ、グローバル変数は避けてください。必要でない場所にソリューションが存在するため、99.9%の時間を避けることができます。

+0

ありがとう、あなたが言っていることは意味がある、私のコードが最適ではないと確信していた、JSは私の強盗から遠く離れている。 :) 何らかの理由で結果変数がまだ2番目の関数に達していない:http://jsfiddle.net/RU8Jq/807/ 何が奇妙なのか? :/ – alfa8884

+0

IDは 'leverage_result'ではなく' result'です! – juandemarco

+1

私は泣いています、どうもありがとう、私はあなたのビールや何かにあなたを扱うことができたらいいと思いますが、私はあなたのコメントをupvoted! :) – alfa8884

関連する問題