长轮询ajax结构问题

时间:2012-04-17 23:18:01

标签: javascript jquery ajax long-polling .post

所以我找到了这个长轮询的好例子,但我无法弄清楚如何通过它传递变量。这就是我提出的,但它不起作用。我非常有信心问题是dataString和type,因为那是我修改的代码的一部分。

$(".post").each(function() {
    poll("somestuff");
});


(function poll(pid) {
    var dataString = 'pid=' + pid;
    $.ajax({
        type: 'GET',
        url: 'http://localhost:8888/site/execs/something.php',
        data: dataString,
        success: function(data) {

            alert('stuff');


        },
        dataType: "json",
        complete: poll,
        timeout: 30000
    });
})();​

有人可以告诉我这是什么我在这里做错了吗?感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:2)

poll()函数永远不会在全局范围内注册。那是因为它被“(...)()”构造包围,这基本上意味着:在没有参数的情况下调用“...”并忘记。

答案 1 :(得分:2)

关于poll的范围,霸主的答案大多是正确的 - 该函数不是全局的。但是,还有更多内容。

您编写poll的方式使其成为所谓的命名函数表达式

请记住,在JavaScript中有两种编写函数的方法。传统的函数声明

function foo() {
    ...
}

声明必须被命名,并且hoisted到顶部(基本上,在执行任何指令之前解析)。或者,函数表达式

var foo = function() {
    ...
}

或者

$.ajax('/', function() {
    // this is what's known as an anonymous callback
});

或者

(function() {
    // this is called a self-executing function...
})(); // <-- because we call it immediately

表达式的执行方式与其他任何代码一样;他们没有被吊起。

现在有趣的部分:函数表达式可能会被赋予可选名称,但该名称不能在函数本身的范围之外访问。换句话说,

(function foo() {
    // `foo` is this function
});

// `foo` will be undefined here

就像写这个:

(function () {
    var foo = arguments.callee; // never do this
    // `foo` is this function
});

// `foo` will be undefined here

由于命名函数表达式只能调用自身(或由在其作用域内声明的函数调用),加上a whole host of browser bugs命名函数表达式实际上是无用的在调试器或分析器中添加一些上下文。


现在让我们来看看你的代码。

首先,您将浏览具有post类的每个元素。 jQuery会立即为每个匹配元素调用您的匿名回调。您尝试拨打poll,但是:

  1. 因为函数表达式没有被提升而不存在; poll代码尚未运行。
  2. 即使它已经运行(例如,如果你将$.each调用移到底部),post仍然是未定义的,因为poll是一个命名函数表达式,而我们刚刚了解到这些标识符只能在函数本身内部使用。
  3. 接下来,您将拥有一个自动执行功能。 (最后一行的()。)换句话说,在没有参数的情况下立即调用poll。你可能会看到一个长轮询发送pid=undefined

    奖励: complete回调(在一次超时或获取数据后开始新的长轮询) 按预期工作,因为{{ 1}}在这一点上适当地在范围内。

    修复所有这些废话就像删除三个字符一样简单。希望在这一点上你能够找出那三个字符。 (提示:将表达式作为声明。)

答案 2 :(得分:2)

或许回答迟到......

除了范围问题,您的轮询功能不是轮询。这只是一个ajax请求。

要进行轮询,您需要调用setTimeout。所以你的代码看起来像是:

(function poll(pid) {
    var dataString = 'pid=' + pid;
    setTimeout(function() {
        $.ajax({
            type: 'GET',
            url: 'http://localhost:8888/site/execs/something.php',
            data: dataString,
            success: function(data) {

                alert('stuff');


            },
            dataType: "json",
            complete: poll,
            timeout: 30000
        });
    })
})();