2009-12-19 50 views
0

今天我正在使用鏈式函數調用進行一個寵物項目,我很好奇當鏈中最後一個函數執行時我該如何檢測。例如:javascript - 檢測鏈接函數的結束?

func1('initial data').func2().func3().func4(); 

而且func2-4後完成工作的「初始數據」我想,當FUNC4完成檢測。由於func4()並不總是鏈中的最後一個函數,例如它可能以.func3()或.func5()結尾,或者我可以將函數調用取決於我正在嘗試執行的操作,我試圖想出一種方法來檢測沒有更多的函數調用正在完成,但我並沒有走得很遠。

+0

如果函數是同步的,那麼這裏沒有什麼特別的。函數返回時完成,無論它是否鏈接。正確。 – 2009-12-20 03:52:45

回答

4

你不能。

此外,如果他們沒有鏈接:

var v = func1('initial data'); 
v = v.func2(); 
v = v.func3(); 
v = v.func4(); 

什麼,你會認爲是最後的功能?每個函數都是它自己鏈中的最後一個函數,但是如果在每一步之後最終確定某個東西,那麼這是行不通的。

只是做一個函數,你最後調用來完成過程。

+1

是的,這基本上是我已經做的。我已經創建了一個done()函數,所以我會鏈接如 func1()。func2()。func3()。done(); 目前它運作得很好。 – Geuis 2009-12-19 22:08:20

+0

當然可以。當函數返回時,函數完成。 – 2009-12-20 03:54:47

+0

@Justin:你誤解了這個問題。他不想知道每個功能何時完成,他想知道什麼時候完成功能。 – Guffa 2009-12-20 10:51:54

4

傳統的做法是把任何你想要的下一行的最終功能後進行:

func1('initial data').func2().func3().func4(); 
allFunctionsDone(); 

;)

+0

正確。問題有點奇怪或神祕。當JavaScript被同步執行時,它的行爲就像任何其他過程語言一樣。當函數返回時,它完成,然後你可以繼續。 – 2009-12-20 03:56:33

3

你可以寫的序,這將幫助你做到這一點的您。而不是執行直接的呼叫,轉移功能的名稱,並逐一打電話給他們。像這樣的東西

executeSequence(func1('init_dat'),[ 
    'func2', 
    'func3', 
    'func4' 
]); 
+0

對此沒有任何好處。 – 2009-12-20 03:55:40

+0

我投票贊成,因爲如果其中一個返回的對象可能或可能沒有鏈中的下一個方法,那麼這會有好處。序列器可以在調用它之前檢查下一個方法是否存在。 – Rich 2009-12-20 09:23:00

+0

@Justin Johnoson,恕我直言:它完全取決於如何以及在何種情況下使用此代碼。如果你構建了一些可以被參數化的動態代碼,使用嵌套的順序器,錯誤處理,start()和stop()等等,它可能非常有用。 – nemisj 2009-12-20 11:20:50