Xhr:API加密货币价格警报脚本返回错误和重复的值

时间:2017-10-28 23:07:13

标签: javascript xmlhttprequest javascript-objects

这是一个简单的vanilla JS脚本,连接到CoinMarketCap.com ticker API

它应该做什么:

1)检索硬币数据,将其存储在对象中

2)等待x个时间(在这种情况下为3分钟)

3)重复1),以检索更新的数据

4)比较最近的数据和以前的数据

5)如果某个硬币值上升,console.log警报

6)重复这个过程

做什么: 两个对象(firstValuesecondValue)是重复的。此外,重新开始时(再次调用main()函数),这两个对象的内容无法更新,并显示以前的值。

// Variables

// Set first recorded value 
var firstValue;

// Set second value (most recent)
var secondValue;


// Get the obj from CoinMarketCap API
function getCoinValues() {
    var requestURL ="https://api.coinmarketcap.com/v1/ticker/?limit=10";
    var request = new XMLHttpRequest();
    request.open("GET", requestURL);
    request.send();

    // When loaded assign to obj variable and return it
    request.onload = function getUsdValues() {
        // Save data to the 'obj' object
        obj = JSON.parse(request.response);
        console.log("Retrieved coin data"); 
        };
    return obj;
}


// Wait 
function wait(ms){
    console.log("Waiting.")
    var start = new Date().getTime();
    var end = start;
    while(end < start + ms) {
    end = new Date().getTime();
     }          
}


// Compare two objects
function comparePrices (obj1, obj2) {
    // Take price from one array, compare to the other
    for (var i = 0; i < obj1.length; i++) {
            // console.log(JSON.stringify(obj2[i].id) + " OLD:" + obj1[i].price_usd + "NEW:" + obj2[i].price_usd)
            if (obj2[i].price_usd > obj1[i].price_usd) {
               console.log(JSON.stringify(obj2[i].id) + " has increased!");
               console.log("From $" + obj1[i].price_usd + " to $" + obj2[i].price_usd);

             }
        }

}


// Main function //

function main () {
    // Get 1st coin values
    console.log("Getting first values");
    firstValue = getCoinValues();

    // Wait
    console.log("Waiting")
    wait(30000);

    // Retrieve new values
    console.log("Getting second values")
    secondValue = getCoinValues();

    // Compare two sets of values
    console.log("About to compare prices")
    comparePrices(firstValue, secondValue);
    console.log("Prices compared")

    // Do it all again

    // "Emptying" the variables
    firstValue = null
    secondValue = null

    // Starting the main loop
    main();

}

main();

为什么不firstValuesecondValue显示不同的结果,即使价格在代码中有效变化?

请原谅任何不当使用技术术语以及整体编码新手。

1 个答案:

答案 0 :(得分:1)

OP代码包含许多技术和逻辑错误。请参阅固定代码中的注释。

// Variables

// Set first recorded value 
//var firstValue; //no use

// Set second value (most recent)
//var secondValue; //no use

//Save AJAX response here
var currentValue = [];
//define the const URL
var requestURL = "https://api.coinmarketcap.com/v1/ticker/?limit=10";

// Get the obj from CoinMarketCap API - wrong description
//Process request to API
function getCoinValues() {
    //var requestURL = "https://api.coinmarketcap.com/v1/ticker/?limit=10";
    var request = new XMLHttpRequest();
    request.open("GET", requestURL);
    //request.send();//dedine a handler first
    request.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) { //**this** is request
            var tmpObj = JSON.parse(this.responseText);
            if (currentValue && tmpObj) {//compare when both arrays exist
                comparePrices(currentValue, tmpObj);
            }
            if (tmpObj) //response received and parsed
                currentValue = tmpObj;
            //console.log(tmpObj);
        }
    }
    //now it is good time to send request
    request.send();

    // When loaded assign to obj variable and return it
    //request.onload = function getUsdValues() {
    //    // Save data to the 'obj' object
    //    obj = JSON.parse(request.response); //obj was never defined
    //    console.log("Retrieved coin data");
    //};
    //return obj; //never try to return anything from asynchronous function
}


// Wait 
//Good to hang the system
/*
function wait(ms) {
    console.log("Waiting.")
    var start = new Date().getTime();
    var end = start;
    while (end < start + ms) {
        end = new Date().getTime();
    }
}
*/

// Compare two objects (arrays in fact)
function comparePrices(obj1, obj2) { //usage: comparePrices(current,new)
    console.log(new Date().toLocaleTimeString());
    // Take price from one array, compare to the other
    for (var i = 0; i < obj1.length; i++) {
        // console.log(JSON.stringify(obj2[i].id) + " OLD:" + obj1[i].price_usd + "NEW:" + obj2[i].price_usd)
        if (obj2[i].price_usd > obj1[i].price_usd) {
            //console.log(JSON.stringify(obj2[i].id) + " has increased!"); //no need to stringify.
            console.log(obj2[i].id + " has increased! From $" + obj1[i].price_usd + " to $" + obj2[i].price_usd);
        } else if (obj2[i].price_usd < obj1[i].price_usd) {
            console.log(obj2[i].id + " has decreased! From $" + obj1[i].price_usd + " to $" + obj2[i].price_usd);
        } else {
            console.log(obj2[i].id + " No change $" + obj2[i].price_usd);
       }
    }
}

// Main function //

function main() {
    getCoinValues();
    setTimeout(main, 30000);//run again in 30 sec
    return;
    //All remaining code is wrong

    //// Get 1st coin values
    //console.log("Getting first values");
    //firstValue = getCoinValues();

    //// Wait
    //console.log("Waiting")
    //wait(30000);

    //// Retrieve new values
    //console.log("Getting second values")
    //secondValue = getCoinValues();

    //// Compare two sets of values
    //console.log("About to compare prices")
    //comparePrices(firstValue, secondValue);
    //console.log("Prices compared")

    //// Do it all again

    //// "Emptying" the variables
    //firstValue = null
    //secondValue = null

    //// Starting the main loop
    //main();

}

main();

我正在考虑创建一个代码段,但决定不这样做。