2010-07-19 109 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