2012-03-01 67 views
0

我有幾個MooTools XHR請求,我想同步處理。所以我在創建一個新的請求對象時使用選項async: false,並且工作正常。不過,我也想告訴用戶瀏覽器會很忙。爲此,我想利用onRequest,所以當請求觸發時,它會顯示一條消息並,然後變得忙碌起來,之後會有更多的東西與onCompleteMooTools同步請求使'onRequest'無用?

但是,我放入onRequest的東西似乎沒有得到執行。請求立即啓動,立即鎖定瀏覽器,完成後,onComplete就會出現。那麼這是否會使onRequest選項在與async: false結合時無用? 「解決方法」是什麼?我想鏈接會做的伎倆,但這似乎凌亂相比,簡單地使用onRequest

回答

2

這是可疑的 - 儘管我不確定它將如何表現跨瀏覽器。你在用什麼?我在FireFox中沒有經歷過這種情況。

MooTools的創建XHR對象,然後再隨後觸發了onRequest事件:

https://github.com/mootools/mootools-core/blob/master/Source/Request/Request.js#L199-212

它,然後做xhr.send(data); - 不應該有任何情況下,該瀏覽器將阻止UI線程,而不是火事件(回調本身是異步的)。

看看這個例子上的jsfiddle在響應3秒鐘的延遲,並且下面警報將觸發完成後,將onRequest觸發正確:

http://jsfiddle.net/dimitar/gDjJG/

最壞的情況下,我想你可以重構Request.send在創建xhr對象實例之前分派事件,但我不認爲它需要它。使用同步阿賈克斯是失敗者和反模式,雖然它可能有用於驗證用戶名可用性或任何。

編輯似乎在WebKit的突破和阻塞UI線程DOM更新xhr.send了。它似乎更新元素屬性,但後來爲QUEUE實際迴流。我會看看我們是否可以在xhr設置之前更改mootools來觸發事件。接得好。

我已經申請了門票,看它的補丁或做在worst case位建議:

https://github.com/mootools/mootools-core/issues/2317

+0

非常感謝!的確,我正在使用Safari。我通過在'onRequest'中放置'console.info('hit');'來試用它。它不會說'打'。你的例子也演示了這種效果。我意識到同步阿賈克斯是不酷的,但這只是每10-15年1阿賈克斯,並且確實重要的事情正在進行。但我正在研究一個服務器端解決方案,以避免在javascript中執行同步ajax或一些複雜的檢查方案。 – kasimir 2012-03-01 11:51:08

+0

它運行onRequest - 只有在UI線程解鎖後它纔會顯示DOM的任何更改。 – 2012-03-01 12:07:25

+0

好吧,它可能會有用,如果它改變了DOM,但;-) – kasimir 2012-03-01 12:58:27