2010-07-19 74 views
0

我注意到有时(随机)我的Mootools ajax请求获取两次。第二个请求立即成功,但第一个请求只是无限期地等待。我不确定这是否是Mootools中的一个错误,或者我已经完成了一些事情。随机复制ajax请求

这已经在firefox和firefox开发者控制台中用chrome验证过。我无法在IE中验证它,但症状是一样的。

我实际上设法采取放火的显示问题的屏幕截图:http://janipeltoniemi.net/ajax.png

在你看到请求循环剧本我写的用于测试目的的权利。它只是在前一个请求完成后用一个新的ID进行请求,所以没有什么特别。控制台中的最后2行显示了我遇到的问题。正如你所看到的,他们都有相同的回应和相同的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

你必须发布你的代码。 – 2010-07-19 18:13:27

+0

这并不显示什么事件驱动ajax请求本身。 – 2010-07-20 07:45:56

+0

我不知道我明白。问题不在于上述代码的具体情况。这只是一个快速重现问题的方式,并且是所需的所有代码(除了Mootools核心1.2.4)。 我认为这里的问题是通过正确地获取消息,因为我的英语不好,所以让我再试一次: 代码应该在firebug中按原样运行。当前一个完成时,它会启动一个无限循环,并执行另一个请求。在某些时候,请求被复制(检查图像)并且'onSuccess'没有被触发,所以循环停止。请参阅代码中的注释以获取更多信息。 – jpeltoniemi 2010-07-20 10:56:35

回答

0

这似乎与回收请求类的旧实例,它的“准备”之前做因此旧请求会在没有服务器的情况下触发onSuccess,从而关闭客户端失去兴趣的连接并重新启动它,从而使萤火虫处于等待状态。

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/ demoing最后一个代码,工作正常,并在完成并且不互相干扰的方式。

+0

看来我没有提到在最初的情况下请求实例没有被回收,对此抱歉。另外,这不仅仅是一个案例。我一直在这里和那里注意到这种奇怪的行为,但直到最近我才开始把它看作一个问题。 – jpeltoniemi 2010-07-20 16:35:24

+0

好 - 有听起来恼人的风险 - 供将来参考,发布您的确切代码/网址或构建一个测试用例,成功复制您的问题,供大家看到。否则,你只是在浪费每个人的时间。祝好运修复,我知道的Request类没有问题。寻找重复的事件绑定,将触发ajax。 – 2010-07-20 19:39:15

+0

是的,我知道。我可能应该已经发布了原始代码,但是如果将它剥离为裸露的骨骼,它与测试用例(除了重用请求实例)确实没有区别。发布的代码被我用来快速重现问题(有时在出现前需要超过1000次请求),并且由于它似乎成功地重现了问题,所以我没有再想。 – jpeltoniemi 2010-07-21 08:05:38