随机复制ajax请求

时间:2010-07-19 02:58:20

标签: ajax mootools xmlhttprequest

我注意到有时(随机)我的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();

1 个答案:

答案 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/演示最后一个代码,工作正常并且完成并且不会相互干扰。