2

首先,我一点也不精通 JavaScript。我已经将这个函数拼凑在一起,以提取一些统计数据并将它们作为 html 字符串应用到使用 JSON 的相关元素中。有时它有效,有时则无效。

AFAIK,该函数应在执行任何操作之前等待 3 秒,然后每 2 秒重复该函数(正确吗?)。

var userGameStats = setTimeout(function () {
    $.getJSON('/id/stats', function (data) {
        // Pull the stats
        var userWinningBets = data.winningBets,
        userLosingBets = data.losingBets,
        userTotalBets = data.totalBets,
        userStreak = data.streak,
        userBestStreak = data.bestStreak;

        // Apply stats to elements
        $('#stats_won span').text(userWinningBets);
        $('#stats_lost span').text(userLosingBets);
        $('#stats_total span').text(userTotalBets);
        $('#stats_ratio span').text((userTotalBets > 0) ? ((userWinningBets / userTotalBets) * 100).toFixed(1) + '%' : "0%");
        $('#stats_streakbest span').text(userBestStreak);
        $('#stats_streak span').text(userStreak);
    });

    userGameStats();
    setInterval(userGameStats, 2000);
}, 3000);

我收到此错误(在控制台中):

Uncaught TypeError: Property 'userGameStats' of object [object Object] is not a function
(anonymous function)

我该如何解决这个问题?有没有更好、更正确的方法来格式化语法?

4

2 回答 2

4

在您的情况下userGameStats,返回的值setTimeout()是对创建的计时器(一个 int 值)的引用,这就是错误的原因。

它应该是

var userGameStats = function () {
    $.getJSON('/id/stats', function (data) {
        // Pull the stats
        var userWinningBets = data.winningBets,
            userLosingBets = data.losingBets,
            userTotalBets = data.totalBets,
            userStreak = data.streak,
            userBestStreak = data.bestStreak;

        // Apply stats to elements
        $('#stats_won span').text(userWinningBets);
        $('#stats_lost span').text(userLosingBets);
        $('#stats_total span').text(userTotalBets);
        $('#stats_ratio span').text((userTotalBets > 0) ? ((userWinningBets / userTotalBets) * 100).toFixed(1) + '%' : "0%");
        $('#stats_streakbest span').text(userBestStreak);
        $('#stats_streak span').text(userStreak);
    });
}

setTimeout(function(){
    userGameStats();
    setInterval(userGameStats, 2000);// once started repeat every 2 seconds
}, 3000); //first time wait for 3 seconds
于 2013-07-16T11:37:44.343 回答
1

您可以在初始 setTimeout 内为函数指定名称。然后,您可以在函数内部的新 setTimeout 中引用此函数。

    setTimeout( function userGameStats() {
    $.getJSON('/id/stats', function (data) {
        // Pull the stats
        var userWinningBets = data.winningBets,
        userLosingBets = data.losingBets,
        userTotalBets = data.totalBets,
        userStreak = data.streak,
        userBestStreak = data.bestStreak;
        // Apply stats to elements
        $('#stats_won span').text(userWinningBets);
        $('#stats_lost span').text(userLosingBets);
        $('#stats_total span').text(userTotalBets);
        $('#stats_ratio span').text((userTotalBets > 0) ? ((userWinningBets / userTotalBets) * 100).toFixed(1) + '%' : "0%");
        $('#stats_streakbest span').text(userBestStreak);
        $('#stats_streak span').text(userStreak);
    });
    setTimeout( userGameStats , 2000 );
}, 3000);
于 2013-07-16T11:57:14.223 回答