【问题标题】:Setting a variable in a recursive JQuery/Javascript self-executing function (polling)在递归 JQuery/Javascript 自执行函数中设置变量(轮询)
【发布时间】:2015-09-03 14:29:24
【问题描述】:

我需要在递归自执行 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 是单线程的。我已经阅读了很多其他人的编码,但我并没有真正想到他们的脚本通常会运行一次然后继续下一个。我的“事件循环”正在阻止其他脚本运行,是的,函数本身应该在外部具有变量。

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

【问题讨论】:

  • prob 是完成回调,当你的 ajax 完成时,会再次调用 poll,所以会再次调用脚本 var tick=0。尝试将蜱虫移到外面不起作用?控制台说什么?有什么错误吗?
  • 我会在 ajax 调用上使用 setInterval,这样您就不会覆盖您的 poll 变量。如果您不希望它第一次等待 10 秒,那么您必须第一次自己调用该函数。

标签: javascript jquery variables long-polling self-executing-function


【解决方案1】:

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

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);
})();

【讨论】:

  • 由于某种原因,当在外部声明变量时,此脚本和同一页面上的第二个轮询脚本(不需要刻度变量)中的轮询都会停止。我是一个 Javascript 菜鸟,刚开始学习 Eloquent Javascript 书,但我需要这个脚本在我完成这本书之前尽快工作。:)
  • 好吧,也许你应该试试 setInterval 函数?
  • 是的,这对我有用。我在上面提到的 Javascript 并发上犯了一个错误,但是在我解决了单线程问题之后,你的建议奏效了。
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
相关资源
最近更新 更多