Mam następujący kod, który pobiera aktualną cenę Ethereum w USD, a następnie konwertuje wartość USD na walutę wybraną przez użytkownika po kliknięciu przycisku. Problem polega na tym, że konwersja USD nie odbywa się, dopóki przycisk nie zostanie kliknięty dwukrotnie. Byłbym wdzięczny za kolejną parę oczu!

            <script>
            $(document).ready(function() {
                var eth_in_usd;
                var currency_rate;
                var mycurrency_to_eth;
                var currency_iso;
                var currency_name;
                var percentage_difference;
                var myrate;

                currency_iso = $("#trade_currency").val();          

                $("#trade_currency").change(function() {
                    currency_name = $("option:selected", this);
                    currency_iso = this.value;
                }); 

                $("#getrate").click(function() {

                    $.get( "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD&api_key=db65a0124a5b2d123a3d257699af8146c6e6bcedafa4302d218a33b1a96eb1c7",
                    function( data ) {                  
                        eth_in_usd = data["USD"];

                        var conversion = "USD_"+currency_iso;
                        $.get( "https://free.currconv.com/api/v7/convert?q="+ conversion +"&compact=ultra&apiKey=caa74f2037254dcc3adb",
                        function ( response ) {
                            currency_rate = response[conversion];
                        });                         

                        currency_rate = eth_in_usd*currency_rate;
                        $( '#eth_to_currency' ).text("The current Ethereum price is " +currency_rate+ " "+currency_iso+" (based on the average price of the top 50 exchanges by volume).");                 

                    });                 

                    percentage_difference = $("#mypercentage").val();
                    var percentage_value = mycurrency_to_eth*(percentage_difference/100)

                    myrate = parseFloat(percentage_value) + parseFloat(mycurrency_to_eth);
                    myrate = parseFloat(myrate).toFixed(2);

                    $("#myrate").text(myrate + " " + currency_iso);
                });
            });
            </script>
0
Adam 20 listopad 2019, 14:02
1
currency_rate = eth_in_usd*currency_rate; i następna linia mają miejsce poza wewnętrznym połączeniem $.get(). Oznacza to, że są uruchamiane przed wykonaniem wewnętrznego $.get(). Powinny znajdować się w wywołaniu zwrotnym wewnętrznego $.get()
 – 
Patrick Evans
20 listopad 2019, 14:09
Skąd pochodzi wartość mycurrency_to_eth?
 – 
Andreas
20 listopad 2019, 14:10
$.get( "free.currconv.com/api/v7/convert? q="+ konwersja +"&compact=ultra&apiKey=caa74f2037254dcc3adb", function ( response ) { currency_rate = response[conversion]; currency_rate = eth_in_usd*currency_rate; }); -- tak? Wciąż daje ten sam wynik .
 – 
Adam
20 listopad 2019, 14:12
Ignoruj mycurrency_to_eth, część czegoś innego
 – 
Adam
20 listopad 2019, 14:14

1 odpowiedź

Problem w tym, że dzwonisz

$.get()

W ramach zdarzenia kliknięcia przycisku i innych operacji poza odebraniem połączenia, które będą z natury asynchroniczne. Spróbuj obiecać

  $("#getrate").click(function() {
    getCurrentPirce().then(function(data){
  eth_in_usd = data["USD"];

                        var conversion = "USD_"+currency_iso;
                        $.get( "https://free.currconv.com/api/v7/convert?q="+ conversion +"&compact=ultra&apiKey=caa74f2037254dcc3adb",
                        function ( response ) {
                            currency_rate = response[conversion];
                        });                         

                        currency_rate = eth_in_usd*currency_rate;
                        $( '#eth_to_currency' ).text("The current Ethereum price is " +currency_rate+ " "+currency_iso+" (based on the average price of the top 50 exchanges by volume).");                 

                    percentage_difference = $("#mypercentage").val();
                    var percentage_value = mycurrency_to_eth*(percentage_difference/100)

                    myrate = parseFloat(percentage_value) + parseFloat(mycurrency_to_eth);
                    myrate = parseFloat(myrate).toFixed(2);

                    $("#myrate").text(myrate + " " + currency_iso);
  })


                    });

                    function getCurrentPirce(){
                    return new Promise(function(resolve){
                      $.get( "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD&api_key=db65a0124a5b2d123a3d257699af8146c6e6bcedafa4302d218a33b1a96eb1c7",
                    function( data ) {                  
                       resolve(data);
                    });    
                    })
                    }

Przepraszam, przegapiłem wewnętrzną $ .get () ..

Spróbuj tego ---

 $("#getrate").click(function() {
    getCurrentPirce().then(function(crrRate){
      currency_rate = eth_in_usd*crrRate;
      $( '#eth_to_currency' ).text("The current Ethereum price is " +currency_rate+ " "+currency_iso+" (based on the average price of the top 50 exchanges by volume).");                 
      percentage_difference = $("#mypercentage").val();
      var percentage_value = mycurrency_to_eth*(percentage_difference/100)
      myrate = parseFloat(percentage_value) + parseFloat(mycurrency_to_eth);
      myrate = parseFloat(myrate).toFixed(2);
      $("#myrate").text(myrate + " " + currency_iso);
    })
});

function getCurrentPirce(){
  return new Promise(function(resolve){
    $.get( "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD&api_key=db65a0124a5b2d123a3d257699af8146c6e6bcedafa4302d218a33b1a96eb1c7",
          function( data ) {
            eth_in_usd = data["USD"];
            var conversion = "USD_"+currency_iso;
            $.get( "https://free.currconv.com/api/v7/convert?q="+ conversion +"&compact=ultra&apiKey=caa74f2037254dcc3adb",
                  function ( response ) {
                  currency_rate = response[conversion];
            });  
      resolve(currency_rate);
    });    
  })
}
0
user7417866 20 listopad 2019, 21:14
Popraw wcięcie. Naprawdę ciężko jest "śledzić" swój scenariusz ...: |
 – 
Andreas
20 listopad 2019, 14:19
Dzięki. Daje mi to jednak ten sam wynik. Muszę dwukrotnie kliknąć przycisk. Potrzebowałbym aktualnej ceny Ethereum w USD, zanim zmienię ją na inną walutę. Czy miałoby sens ich zamiana?
 – 
Adam
20 listopad 2019, 14:22
Wygląda na to, że problem polega na tym, że nie otrzymuje domyślnej waluty.
 – 
Adam
20 listopad 2019, 15:16
Nie musisz otaczać metod jquey ajax w obietnicy, to już zwraca Thenable. Ponadto nadal obliczasz currency_rate poza wewnętrzną $.get()
 – 
Patrick Evans
20 listopad 2019, 15:17
Waluta_rate poza $ .get () jest ustawioną wartością domyślną. Usunąłem to i oddzieliłem funkcje. Teraz obliczam ostateczną stawkę (myrate) po kliknięciu #getrate. Działa, ale nie jest idealny, ponieważ lepiej byłoby mieć również domyślną wartość opcji.
 – 
Adam
20 listopad 2019, 16:16