2013-04-05 200 views
0

我有一個昂貴的函數createNewWindow()。我想在調用方法時顯示進度指示器,然後在函數結束時隱藏該指示器。我嘗試過的所有事情,除非方法已經完成,否則我沒有看到進度指示器,所以我試圖以同步方式調用該方法(和失敗)。異步調用函數?

我嘗試這樣做:

​​

而且createNewWindow的最後一行是$( 「#進步」)顯示()。沒有工作。在此之前,我嘗試過:

$("#submit").click(function() { 
    $("#progress").show(); 
    setTimeout(createNewWindow(), 0); 
}); 

同樣的效果。

什麼是正確的方法來做到這一點?

我看到一些其他的SO帖子,如this描述使用setInterval或setTimeout,但我無法讓他們像我期待的那樣工作。

+0

以異步方式調用同步函數並不是如此。它仍然會阻止瀏覽器,你最好的選擇是旋轉的東西。 – adeneo 2013-04-05 23:16:05

回答

3

這是一個常見的錯誤。問題就在這裏:

setTimeout(createNewWindow(), 0); 

這將立即撥打createNewWindow和結果(可能無效)傳遞給setTimeout。這不是你想要的,你想要的功能createNewWindow傳遞給setTimeout爲它在以後的時間把它叫做:

setTimeout(createNewWindow, 0); 

注意缺少括號。您將createNewWindow(這是一個函數)的值傳遞給setTimeout,而不是調用它並傳遞其返回值。

這應該使進度條馬上顯示出來。但是,如果createNewWindow是一個非常昂貴的功能,並且會佔用大量資源,那麼仍然會減慢您的網頁,因爲您的所有JavaScript代碼都運行在同一個線程中。在這種情況下,您可能需要考慮using a Worker

+0

這是一個很棒的結果,謝謝!不幸的是,它仍然沒有得到正確顯示的進展...可能是因爲它是你在同一個線程中提到的。但是,我只看到了一些將js文件的URL加入的工作人員的例子?有沒有辦法用功能創建一個新的工人?也許和'新工人(createNewWindow)'一樣簡單? – Nicros 2013-04-05 23:33:28

+0

不,那沒有工作:) – Nicros 2013-04-05 23:47:10