2016-05-07 2 views
0

Я полный JS noob, так что медведь со мной пожалуйста.Передача переменных javascript между функциями

У меня есть простой JS для запроса цены акций yahoo, который отлично работает, однако по какой-то причине я не могу передать переменную результата другой функции, где я хотел бы выполнить некоторые другие вычисления с ней. Я вставил упрощенную версию здесь.

Если кто-то может помочь, я был бы признателен, поэтому я не мог понять это, все утро. :(

Спасибо!

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

хорошо, но должно быть, однако, существует беспорядок вокруг того, как я сохраняю переменную результата во второй функции, вне которой вызов 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 далек от моего сильного костюма. :) по какой-то причине переменная результата по-прежнему не достигает второй функции: http://jsfiddle.net/RU8Jq/807/ Любая идея, что я испортил? :/ – alfa8884

+0

Идентификатор является 'результатом', а не' leverage_result'! – juandemarco

+1

Я плачу, большое спасибо, мне жаль, что я не мог бы угостить тебя пивом или чем-то еще, тем не менее я оставил ваш комментарий! Большое спасибо еще раз !!!! :) – alfa8884

Смежные вопросы