所以我找到了这个长轮询的好例子,但我不知道如何通过它传输变量。这是我想出来的,但行不通。我非常有信心问题出在 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
,但它:
- 尚不存在,因为函数表达式尚未提升;
poll
代码尚未运行。 - 即使它已经运行(例如,如果您将
$.each
调用移至底部),post
仍将是未定义的,因为poll
是一个命名函数表达式,我们刚刚了解到这些标识符仅在函数本身内部可用。
接下来,您将拥有一个自动执行的函数。 (最后一行的()
。)换句话说,poll
会立即调用,不带任何参数。您可能会看到一个长轮询发送 pid=undefined
。
奖励:complete
回调(在超时或获取数据后开始新的长轮询)确实按预期工作,因为 poll
此时已正确处于范围内。
解决所有这些废话就像删除三个字符一样简单。希望此时您能够弄清楚这三个 Angular 色是哪三个。 (提示:让你的表达成为一个声明。)
关于javascript - 长轮询ajax结构问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10200583/