正确调试 Javascript 问题? (很可能是客户端)

Debug a Javascript issue properly? (most likely client-side)

这个问题很可能是客户端问题,但我不确定。这是关于一个拍卖网站,我使用 WebSocket(node.js 服务器)每秒获取数据(价格、剩余时间)。

如果价格发生变化,我的脚本会自动触发一个事件,在该事件中,本次拍卖的倒计时和价格会闪烁,并且我的数组 timers 会刷新为剩余秒数 (auction.duration):

if ($('.price' + timers[i][0]).data('curr_text') !== $('.price' + timers[i][0]).text()) 
{
$(".flashing" + timers[i][0]).toggle("highlight").toggle("highlight");
timers[i][1] = auction.duration;        
}

所以,我离开了几个小时,一些拍卖计时器归零(显示为 00:00:00),但不是所有计时器。当我刷新页面时,这些拍卖仍然是 运行,所以这很可能是客户端 JavaScript 问题。还有一个大问题,因为用户认为拍卖已经结束,刷新页面并会注意到它实际上仍然是 运行.

我只能猜测这个问题的发生是由于一些时间问题,但我不确定。我也不知道如何调试这个问题,因为我不能盯着屏幕几个小时等待它发生。所以我很感激调试这个的建议。

我认为向您展示我的完整代码也很有帮助,也许您会看到我遗漏的内容:

// prevent flashing after page loaded
$(".refresh-item").each(function() {
$this = $(this);
var id = $this.attr("data-id"); 
$('.price' + $this.attr("data-id")).data('curr_text', $('.price' + id).text());
});
// format timer
var formatSeconds = function(secs){
    var pad = function(n) {
        return (n < 10 ? "0" + n : n);
    };
    var h = Math.floor(secs / 3600);
    var m = Math.floor((secs / 3600) % 1 * 60); // Reminder of an hour of seconds x 60
    var s = Math.floor((secs / 60) % 1 * 60); // Reminder of a minute of seconds x 60
    return pad(h) +":"+ pad(m) +":"+ pad(s);
};  

var timers = [];
var socket = io.connect('http://xxx.rhcloud.com:8000/',{'forceNew':true });
socket.on('stream', function (data) {
    $.each(data.streamArray,function(index,auction){    
    duration = auction.duration;
    num_rows = data.streamArray.length;

    if (duration > 0)
    {
    var price_retail = $("#" + auction.id).attr("data-retail"); 

    var calc = auction.price.toFixed(2);
    var price_calc = calc.toString().replace(/\./g, ',');   
    $(".price" + auction.id).html(price_calc + "€");            
    $(".discount" + auction.id).html(discount + "%");

    if (timers.length < num_rows)
    timers.push([auction.id, auction.duration]);
    for(i in timers) 
    {                   
        if ($('.price' + timers[i][0]).data('curr_text') !== $('.price' + timers[i][0]).text()) 
        {
        $(".flashing" + timers[i][0]).toggle("highlight").toggle("highlight");
        timers[i][1] = auction.duration;        
        }
    }   
    $('.price' + auction.id).data('curr_text', $('.price' + auction.id).text());        
    } 
    else
    {
    $(".sold" + auction.id).html("<div class='sold'>SOLD</div>").fadeOut('fast').fadeIn('fast');            
    }
    });
});
function timerCount() {
    for(i in timers) {              
        if(timers[i][1] <= 0) {
        delete timers[i]; // if timer seconds is less than 1, delete it.
        } else {            
        timers[i][1]--; // else, decrease it by 1 second.
        duration_html = formatSeconds(timers[i][1]);        
        $(".duration" + timers[i][0]).html(duration_html);              
        }   
    }
}
setInterval(timerCount, 1000);

同样重要的是,如果拍卖实际结束,将出现一个名为 "SOLD" 的红色标志(请参阅套接字流结束)。但这也没有发生。计时器刚刚停止并转到00:00:00。所以它必须对 delete timers[i] 触发得太早的数组做一些事情,我猜?

附加信息: 我忘了提到这些计时器重置为大约。每次用户出价需要 15-16 秒。所以数组 timers 存活了很长时间。这个数组每秒循环一次。

据我了解,您的计时器每 1 分钟被以下代码删除一次:

function timerCount() {
    for(i in timers) {              
        if(timers[i][1] <= 0) {
            delete timers[i]; // if timer seconds is less than 1, delete it.
        } else {            
            timers[i][1]--; // else, decrease it by 1 second.
            duration_html = formatSeconds(timers[i][1]);        
            $(".duration" + timers[i][0]).html(duration_html);              
        }   
    }
}

您要在哪些方面减少分钟数和小时数?

第二件事 - 你不能保证客户端和服务器上的时间是同步的,所以你应该在计时器中执行一些 AJAX 时间请求并以一定的间隔调整你的计时器。