0

我需要在递归自执行 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);
    })();

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

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

更新:好吧,花了大部分 Eloquent Javascript 书和 7 个 Douglas Crockford 视频来找出问题所在,但我没有意识到 Javascript 是单线程的。我已经阅读了很多其他人的编码,但我并没有真正想到他们的脚本通常会运行一次然后继续下一个。我的“事件循环”正在阻止其他脚本运行,是的,函数本身应该在外部具有变量。

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

4

1 回答 1

0

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

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);
})();
于 2015-09-03T14:39:54.877 回答