javascript - 长轮询ajax结构问题

标签 javascript jquery ajax long-polling .post

所以我找到了这个长轮询的好例子,但我不知道如何通过它传输变量。这是我想出来的,但行不通。我非常有信心问题出在 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
    });
})();​

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

最佳答案

关于poll的范围,hegemon的回答基本上是正确的——该功能不是全局的。然而,还有更多内容。

您编写 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 是一个命名函数表达式,我们刚刚了解到这些标识符仅在函数本身内部可用。

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

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

解决所有这些废话就像删除三个字符一样简单。希望此时您能够弄清楚这三个 Angular 色是哪三个。 (提示:让你的表达成为一个声明。)

关于javascript - 长轮询ajax结构问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10200583/

相关文章:

javascript - 阻止了具有 origin "http://static.ak.facebook.com"的框架访问具有 origin 的框架

javascript - ajax 发布错误 : NETWORK_ERR: XMLHttpRequest Exception 101 on android device

javascript - 极其简单的HTML js代码,但是为什么不行呢?

php - 无法让委托(delegate)方法发挥作用

javascript - Rails 4 - 通过 ajax 在引导模式中显示数据

javascript - 被速记语法混淆 : x > 0 ? 1 : -1;

php - 将 PHP 表单插入到 MySQL 数据库会产生重复的意外结果

php - 如何在 AJAX 上接收 PHP 表,并将其显示在 DIV 中?

javascript - jQuery 淡入淡出 DIV 内容

javascript - 如何防止动画结束功能