我注意到有时(随机)我的Mootools ajax请求会被发送两次。第二个请求立即成功,但第一个请求无限期地等待。我不确定这是Mootools中的错误还是我做过的事情。
这已经通过firefox和chrome中的开发者控制台中的firebug进行了验证。我无法在IE中验证它,但症状是一样的。
我实际设法截取了显示问题的萤火虫:[{3}}
在右侧,您会看到我为测试目的而编写的请求循环脚本。它只是在上一个请求完成后使用新的id发出请求,所以没有什么花哨的。控制台中的最后两行显示了我遇到的问题。如您所见,它们都具有相同的响应和相同的ID。 md5哈希是使用md5(microtime(1))
生成的,因此如果这两个实际上是具有相同ID的不同请求,它应该是不同的。
循环在此时停止,因为它在最后一个事件完成时不会触发onSuccess事件。我猜它会在其他请求完成时触发它,但是还没有发生。
有什么想法在这里发生了什么?
几乎忘了,我正在使用Mootools 1.2.4
图片中的代码:
r = new Request.HTML();
counter = 0;
//increments the counter and requests hello.php
go = function() {
counter += 1;
//The loop was too fast and producted some side effects when delay was not used
r.get.delay( 10, r, [ 'templates/hello.php', { counter: counter } ] )
}
//Create an endless loop. When the request from go() is finished, call go()
r.addEvent( 'success', go );
//Start the endless loop
go();
答案 0 :(得分:0)
这似乎与在“准备好”之前回收Request类的旧实例有关,因此旧请求触发onSuccess,而服务器关闭连接,客户端失去兴趣并重新启动它,将firebug留在等待状态。
http://www.jsfiddle.net/dimitar/NF2jz/201/
var r = new Request.HTML({
url: '/ajax_html_echo/',
data: {'html': "hello"},
method: 'post',
update: 'target_div',
onSuccess: function(response) {
(function() {
go(); // you can reproduce the bug by removing the delay wrap
}).delay(1000);
}
});
var counter = 0;
var go = function() {
counter++;
// despite of trying r.cancel(), it does not cancel,
// you can set onCancel to test this;
r.cancel().setOptions({
data: {html: "attempt " + counter}
}).send();
};
go();
严格地说,如果你使用匿名函数,你不需要回收旧实例 - 甚至保存它。
我会做的是这样的事情(但可能是重构的,所以可以取消):
var counter = 0;
(function go() {
counter++;
// fresh instance after success / complete:
new Request.HTML({
url: '/ajax_html_echo/',
data: {'html': "hello " + counter},
method: 'post',
update: 'target_div',
onSuccess: function(response) {
go();
}
}).send();
})();
http://www.jsfiddle.net/dimitar/NF2jz/202/演示最后一个代码,工作正常并且完成并且不会相互干扰。