elodie
elodie

Reputation: 23

How to retrieve a value from a variable outside of a condition?

I'm learning JS, but I don't know if it's possible to do what I want to achieve.

I have a variable named btcVariationTotal which is in a condition, and I want to retrieve the value of this variable in another variable called tmp, but this variable is not included in the condition.

My problem is that tmp always shows me 0. I don't understand why? And how can I solve this problem, please?

enter image description here

I really want to retrieve the value outside the condition.

console.clear();

let wsBtc = new WebSocket('wss://stream.binance.com:9443/ws/btcusdt@trade');

let btcStockPriceElement1 = document.getElementById('btcValue1');
let btcStockPriceElement2 = document.getElementById('btcValue2');


let btcLastPrice = null;
let btcStockObject = null;

wsBtc.onmessage = (event) => {
  btcStockObject = JSON.parse(event.data);
};

let btc1 = 0, btc2 = 0;
let btcVariation_1_2 = 0;
let btcVariationTotal = 0; 

let tmp = 0; 



let btcRunTimers = setInterval(() => {
  let minutes = new Date().getMinutes();
 if (minutes === 51) {
    let val1 = parseFloat(btcStockObject.p).toFixed(1);
    let price = parseFloat(btcStockObject.p).toFixed(1);

    btcStockPriceElement1.innerText = price;
    btcStockPriceElement1.style.color =
      !btcLastPrice || btcLastPrice === price
        ? 'black'
        : price > btcLastPrice
        ? '#AAFF00'
        : 'red';

    btcLastPrice = price;
    btcStockObject = null;

    btc1 = val1;

  }

if (minutes === 52) {
    let val2 = parseFloat(btcStockObject.p).toFixed(1);
    let price = parseFloat(btcStockObject.p).toFixed(1);

    btcStockPriceElement2.innerText = price;
    btcStockPriceElement2.style.color =
      !btcLastPrice || btcLastPrice === price
        ? 'black'
        : price > btcLastPrice
        ? '#AAFF00'
        : 'red';

    btcLastPrice = price;
    btcStockObject = null;

    btc2 = val2;

    btcVariation_1_2 = ( (parseFloat(btc2) - parseFloat(btc1)) / btc1 * 100);

    document.getElementById("btcResult1").innerHTML = btcVariation_1_2.toFixed(2);
    
  }

  btcVariationTotal = (parseFloat(btcVariation_1_2));
  console.log("btc variation => " + btcVariationTotal);
  document.getElementById("result").innerHTML = btcVariationTotal.toFixed(2);
  tmp = btcVariationTotal;


}, 60000);


console.log("tmp => " +  tmp); 

Upvotes: 0

Views: 58

Answers (1)

joao
joao

Reputation: 2293

The good news is that you are in fact doing what you want: you are retrieving the value of the btcVariationTotal variable, and storing in tmp, which is defined in the outer scope, outside of your setInterval callback.

The only problem you have is that you can't display a modified tmp, and that's because you only call console.log before setting tmp, you never call it after it has been changed. User Ivar has tried to explain that in the comments, maybe I can detail it a bit more:

At time t=0, you set tmp = 0, you set your timers with setInterval, associating a callback function (which does NOT run at this point), and then you call console.log to display tmp (it's 0, because no callback has ever run).

At time t=60s, your callback runs, sets btcVariationTotal to some value, and assigns that to tmp. No attempt is made to display the tmp value. Then this gets repeated every 60s.

So what's missing is for you to write some code that displays the tmp value after it has been changed. One way to do that, is to put that code inside some other callback and arrange for it to be called. I suggest a simple button. Add the following somewhere in your html page:

<button id="show-tmp">Show tmp</button>

Add the following lines at the end of your JS code:

let btn = document.getElementById('show-tmp');
btn.onclick = function() {
    console.log(`tmp: ${tmp}`); 
}

Now clicking on the button will show you the value inside tmp; if you do it before the first 60 seconds, it will show 0; if you do it afterwards, it will show whatever value was in btcVariationTotal.

Upvotes: 2

Related Questions