2012-02-14 91 views
0

我有兩個關於相同主題依賴視角的問題。關於同步性/異步性假設的最佳實踐

讓我們假設有一個接受接收執行函數的返回值的回調函數:

function myFunction(callback) { 
    //do something 
    callback(something); 
} 

現在有人調用這個函數:

myFunction(function(something) { 
    console.log('a'); 
}); 

console.log('b'); 

我的觀點是: 是它總是爲用戶(調用函數的用戶)保存以便對事件'a'和'b'的順序進行假設?結果:依賴於確切的行爲被認爲是糟糕的編碼風格嗎? (不是談論runnig時間,而是關於同步性或異步性!)有人可能會認爲myFunction是異步的,因此'b'在'a'之前必須發生總是

相反: 作爲設計某個功能的人,是否認爲編碼風格不好,沒有可預測的順序?也許有必要等待某個事件的發生,導致異步的回答,或者這種確切的行爲不需要等待,因此不需要異步性。 在這種情況下,添加一個process.nextTick(...)以始終具有相同的行爲是否最好?

在此先感謝!

+7

如果開發者想要安全,他們應該在使用之前瞭解'myFunction'的行爲方式。 – 2012-02-14 18:58:17

+0

這是一個非常外交的回答:)在那個函數的設計者的情況下是什麼? – zaphod1984 2012-02-14 19:24:01

+0

...對下面的評論作出迴應,在用戶無法預測其行爲的情況下創建一個函數並不明智。如果您可以通過使其同步行爲來優化某個特定情況,那麼您應該將其記錄爲需要回調的異步函數。當它結束同步時,您仍然可以在準備就緒時觸發回調。 – 2012-02-14 19:37:41

回答

1

通常,你應該編碼,以便它沒有關係。但是,有些情況下必須延遲發射事件,例如,如果某些事件在構造函數中發射了一個事件 - 當時您無法聽到它。

+0

是的,我明白你的觀點,在構造函數中,程序員必須確保它被延遲。但有人在調用函數時會發生什麼情況?這次*它不是必需的(沒有IO,FS訪問......)使它成爲異步,而在另一種情況下它*是必需的? – zaphod1984 2012-02-14 19:21:50

+0

@ zaphod1984:假設它可能會立即回調,除非模塊文檔或其代碼另有說明。通常情況下,它不會讓你的代碼更復雜,爲什麼不呢? – thejh 2012-02-14 19:35:45

+0

回到你的例子我做了一個要點:https://gist.github.com/1834492我沒有做到這一點,我來到這個問題是什麼導致我這個問題。如果'someAsynchrounosFunction'不會像預期的那樣表現異步,那麼這個代碼不起作用。 – zaphod1984 2012-02-15 08:45:05