许多JSON请求不适用于

时间:2014-01-02 04:58:13

标签: javascript jquery arrays json

我发现了实时JSON自动收录器的这种实现 FTC/BTC BTC-e realtime ticker JSFiddle 你可以看到它工作正常。

但我需要实时获取本网站的所有代码。 我接着做(html):

<div>BTC/USD <span id="p0"></span></div>
<div>BTC/RUR <span id="p1"></span></div>
<div>BTC/EUR <span id="p2"></span></div>
<div>LTC/BTC <span id="p3"></span></div>
<div>LTC/USD <span id="p4"></span></div>
<div>LTC/RUR <span id="p5"></span></div>
<div>USD/RUR <span id="p6"></span></div>
<div>EUR/USD <span id="p7"></span></div>
<div>NMC/BTC <span id="p8"></span></div>
<div>NVC/BTC <span id="p9"></span></div>
<div>TRC/BTC <span id="p10"></span></div>
<div>PPC/BTC <span id="p11"></span></div>
<div>FTC/BTC <span id="p12"></span></div>

接下来(js):

$(function (){
    startRefresh();
});

function startRefresh() {
    setTimeout(startRefresh, 10000);

    var ops = new Array('https://btc-e.com/api/2/btc_usd/ticker','https://btc-e.com/api/2/btc_eur/ticker','https://btc-e.com/api/2/btc_rur/ticker','https://btc-e.com/api/2/ltc_btc/ticker','https://btc-e.com/api/2/ltc_usd/ticker','https://btc-e.com/api/2/ltc_rur/ticker','https://btc-e.com/api/2/usd_rur/ticker','https://btc-e.com/api/2/eur_usd/ticker','https://btc-e.com/api/2/nmc_btc/ticker','https://btc-e.com/api/2/nvc_btc/ticker','https://btc-e.com/api/2/trc_btc/ticker','https://btc-e.com/api/2/ppc_btc/ticker','https://btc-e.com/api/2/ftc_btc/ticker');

    for(var i = 0; i < ops.length; i++) {
    $.getJSON('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20json%20where%20url%3D%22' + encodeURIComponent(ops[i]) + '%22&format=json', function (data) {
     $('#p'+i).html(parseFloat(data['query'].results.ticker.last).toFixed(6));
});
}

它不起作用。 我怎样才能实时获得所有代码?

1 个答案:

答案 0 :(得分:1)

变量i已在回调执行时重新分配(实际上是13次)。在您的请求完成时,i设置为1313代替12因为i++在循环关闭之前最后一次执行。由于#p13不存在,您看不到任何事情发生。

您需要重新构建代码,或使用JavaScript closures

这是一个用于修正脚本的闭包的示例:

for(var i = 0; i < ops.length; i++) {
    // Create a custom callback
    var callback = (function(){
        // Assign i to a local variable j
        var j = i;
        // Create a callback function with our local variable j
        return function(data){
            $('#p'+j).html(parseFloat(data['query'].results.ticker.last).toFixed(6));  
        }
    })();

    // Give our new "custom" callback as the second argument
    $.getJSON('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20json%20where%20url%3D%22' + encodeURIComponent(ops[i]) + '%22&format=json', callback);
}