2011-07-02 47 views
0

我想弄清楚如何在調用另一個函數之前暫停函數的執行,同時使我的JavaScript代碼具有極高的可讀性。這裏是什麼,我試圖做一個例子:使用外部等待類來暫停JavaScript函數的執行

function main_function(){ 
    function a(); 
    // wait for function a to finish - could take 1 second - could take 3 seconds 

    function b(); 
    // wait for function b to finish - don't know how long this will take 

    function c(); 
    // completed 
} 

我看了幾十個關於如何使用setTimeout的文章,重定向到其他功能,回調等,但未能發現果然奏效的解決方案好吧(其中大多數只是使用笨重的setTimeout(),這實際上沒有幫助,因爲我不知道每個函數可能需要多長時間)。

所以,我終於遇到了一個名爲「WaitThread.js」的小工具。這似乎正是我需要做的事情,而且看起來好像它稍後會很容易閱讀和維護。

但是,我想不出如何使用它! :)

任何人都可以提供我一個如何使用這個WaitThread.js的例子嗎?或者至少爲我提供一種可讀/優雅的方式來等待JavaScript函數一個接一個地執行而等待每個人先完成?

這裏是到WaitThread.js頁面的鏈接:

http://www.robertmayo.com/blog/2006/07/htmljavascript-wait-for-asynchronous.html

謝謝!

+0

該解決方案真的不是神奇的或任何東西。它所做的只是用看門狗定時器輪詢某些情況的變化。在網絡瀏覽器中,不存在使用JavaScript代碼「等待」的情況。解決這個問題的唯一方法是採用異步編程模型。 – Pointy

+0

另外,如果你想更詳細地瞭解這些功能在做什麼以及它是什麼讓它們花費很長時間,它將有助於提供一些解釋和建議。 – Pointy

回答

1

根據對waitthread.js的解釋,它只是使用一個計時器來輪詢,等待某個變量值的變化。

這種類型的問題的更典型的設計模式使用回調和function a將調用回調,當它的工作完成將啓動function b。所以,你將一個函數傳遞給function a,當function a完成它的工作時應該調用它。更完整的設計模式通常會針對成功退出和不成功退出進行回調,甚至可能會從退出中傳遞參數,但由於我不知道自己的具體情況,因此我沒有試圖在此處進行建模。對於多步驟的過程,它看起來像這樣。我們假設存在三種異步功能功能a,b和c和各需要一個功能將調用時異步功能齊全的說法:

function main_function_step1() { 
    a(main_function_step2); 
} 

function main_function_step2() { 
    // execute code here that goes after function a, but before function b 
    b(main_function_step3); 
} 

function main_function_step3() { 
    // execute code here that goes after function b, but before function c 
    c(main_function_finish); 
} 

function main_function_finish() 
{ 
    // execute whatever code here to finish 
} 

更完整的解決方案將傳遞一個對象了成功回調和失敗回調,並且會爲每個函數提供至少一個參數,以便返回結果或錯誤條件。

在這種情況下,它應該是這樣的:

function main_function_step1() { 
    function main_function_a_step1_fail(err) 
    { 
    // handle error in step 1 
    } 
    var o = {success: main_function_step2, fail: main_function_a_step1_fail}; 
    a(o); 
} 

function main_function_step2(data) { 
    // execute code here that goes after function a, but before function b 
    function main_function_a_step2_fail(err) 
    { 
    // handle error in step 2 
    } 
    var o = {success: main_function_step3, fail: main_function_a_step2_fail}; 
    b(o); 
} 

function main_function_step3(data) { 
    // execute code here that goes after function b, but before function c 
    function main_function_a_step3_fail(err) 
    { 
    // handle error in step 3 
    } 
    var o = {success: main_function_finish, fail: main_function_a_step3_fail}; 
    c(o); 
} 

function main_function_finish(data) 
{ 
    // execute whatever code here to finish 
} 

這是一個有點雜亂的代碼,但它不需要輪詢或全局變量。如果在這些步驟之間沒有執行代碼並且它們之間的邏輯完全相同,那麼可以在數據結構中參數化所有內容,並使用一個函數執行所有步驟,該函數僅執行數據結構中的一個項目,並傳遞下一個值作爲回調等。

+0

jfriend00 - 感謝您的反饋!這看起來不錯。但是,它仍然看起來有點混亂(正如你在評論中提到的那樣)。你能否給我提供一個如何使用WaitThread.js文件的例子,這樣我就可以看到它是如何工作的,然後我可以修改它以遵守你在這裏顯示的模型。謝謝! – swhitlow

+0

尖尖 - 該功能所做的是調用掃描身份證的Java應用程序。在發生這種情況時,腳本需要等待。當它完成時(即當一個圖像文件實際存在時),它會使用另一個Java包裝程序包裝器,該包裝器將FTP映像直至服務器。完成後,它會解析掃描許可證中的數據。我非常瞭解PHP和C#。但是,JavaScript(我應該說 - 高級JavaScript)對我來說有點新鮮。我花了一些腦筋想一想,我無法調用腳本並等待它完成,然後調用我的下一個腳本。 – swhitlow

+0

我可以做到這一點,如果我打電話給ajax調用(即調用一個PHP文件做一些處理),但是,我只是調用內部JavaScript函數(一個到另一個)時無法做到這一點。 – swhitlow