0

所以我找到了这个长轮询的好例子,但我不知道如何通过它传输变量。这是我想出的,但它不起作用。我很确定问题出在 dataString 和类型上,因为这是我修改的代码的一部分。

$(".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
    });
})();​

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

4

3 回答 3

2

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

于 2012-04-17T23:25:21.873 回答
2

关于范围poll,霸主的回答大多是正确的——函数不是全局的。然而,还有更多。

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

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

function foo() {
    ...
}

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

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

由于命名函数表达式只能调用自身(或由在其范围内声明的函数调用),加上一大堆浏览器错误,命名函数表达式除了在调试器或分析器中添加一些上下文之外几乎没有用处.


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

首先,您遍历每个具有post类的元素。jQuery 立即为每个匹配的元素调用您的匿名回调。您尝试调用poll,但它:

  1. 还不存在,因为函数表达式没有被提升;poll代码还没有运行。
  2. 即使它已经运行(例如,如果您将$.each调用移到底部),post仍然是未定义的,因为poll它是一个命名函数表达式,我们刚刚了解到这些标识符仅在函数本身内部可用。

接下来,您有一个自执行功能。(()在最后一行。)换句话说,poll立即调用,不带参数。您可能会看到一个长轮询发送pid=undefined

奖励:回调complete(在一次超时或获取数据后开始新的长轮询)确实按预期工作,因为poll此时在范围内正确。

修复所有这些废话就像删除三个字符一样简单。希望到此为止,您能够弄清楚它们是哪三个字符。(提示:让你的表达成为一个声明。)

于 2012-04-18T00:27:02.890 回答
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
        });
    })
})();
于 2012-07-31T09:07:51.890 回答