【问题标题】:Javascript function throwing errorsJavascript函数抛出错误
【发布时间】:2013-07-16 11:34:44
【问题描述】:

首先,我一点也不精通 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)

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

【问题讨论】:

  • userGameStats 将是setTimeout 的返回值(它是一个数字),而不是一个函数。您对setInterval 的使用也不正确。每当函数(理论上)被调用时,您都会创建一个新的区间,从而在函数被调用几次后产生无数的区间(呈指数增长)。

标签: javascript function syntax


【解决方案1】:

在您的情况下,userGameStatssetTimeout() 返回的值,它是对创建的计时器(一个 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

【讨论】:

    【解决方案2】:

    您可以在初始 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);
    

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 2012-02-21
      • 2020-03-01
      • 1970-01-01
      相关资源
      最近更新 更多