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