在递归 JQuery/Javascript 自执行函数中设置变量(轮询)

Setting a variable in a recursive JQuery/Javascript self-executing function (polling)

我需要在递归自执行 JQuery 脚本中设置一个具有初始值的变量 (tick)。当我尝试 运行 时,下面的脚本显然 tick 将恢复为 0 而不是 JSON 对象返回的值。

    (function poll(){
        var tick = 0;
        setTimeout(function(){
            $.ajax({
                url: "/client-polling/" + tick,
                success: function(data) {
                    $( "#messagestack" ).append(data[2]);
                    tick = data[0]
                },
                dataType: "json",
                complete: poll
            });
        }, 10000);
    })();

同样出于某种原因,当我 tick 声明函数在第一次轮询之前等待整整 10 秒。如果我尝试在函数之外声明 tick,页面上的所有其他脚本都会冻结。

我在哪里声明 tick 以便第一次调用页面时将其设置为 0,然后从返回的 JSON 对象中获取值?

更新: 好吧,花了 Eloquent Javascript 书的大部分内容和 7 个 Douglas Crockford 视频才弄清楚问题出在哪里,但我失败了意识到 Javascript 是单线程的。我已经通读了很多其他人的编码,但我并没有真正想到他们的脚本通常 运行 通过一次然后继续下一个。我的 'event-loop' 停止了来自 运行ning 的其他脚本,是的,函数本身应该有外部变量。

我最终使用了 iFrame(非 public,单界面应用程序,因此安全性不是问题)只是为了得到它 运行ning,现在正在寻找未来构建的网络工作者。感谢到目前为止的回答。

为什么不直接在函数外设置一个变量?

var tick = 0;
(function poll(){
    setTimeout(function(){
        $.ajax({
            url: "/client-polling/" + tick,
            success: function(data) {
                $( "#messagestack" ).append(data[2]);
                tick = data[0]
            },
            dataType: "json",
            complete: poll
        });
    }, 10000);
})();