在函数

时间:2016-05-07 11:46:14

标签: javascript

我是一个完整的JS菜鸟,所以请耐心等待。

我有一个简单的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>

1 个答案:

答案 0 :(得分:0)

你在这里碰壁,因为你将异步代码视为同步代码。执行$.getJSON代码时,代码不会停止等待结果到达,它会继续。因此,在onBodyLoad函数中,getQuote之后的行会立即执行 ,而不是在getQuote函数内发出的请求结果到达之后。< / p>

您要做的是在从服务器返回结果后运行代码,因此您可以使用回调:

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%的时间可以避免,因为解决方案存在于不需要的地方。