2013-09-23 110 views
0

我知道這些類型的問題相當頻繁地出現,但我需要JavaScript中等待機制的幫助。我知道基於setTimeout的解決方案將會出現,但我不確定如何在我的案例中取消。防止返回,直到條件得到滿足

我在寫內部使用WebSocket的API。有一個connect()方法設置了WebSocket,並且我需要在WebSocket設置完成之後才能返回。我希望它返回連接是否成功的值,但這不是主要問題。

我遇到的問題是用戶調用connect()後,他們可能會調用另一個依賴於WebSocket的方法來正確設置。如果調用得太早,則會拋出一個錯誤,指出該對象不可用。

我當前的解決方案是當我確定連接成功並在每種方法中檢查它時,設置「連接」標誌。如果它沒有連接,我將方法調用添加到通過設置標誌的相同代碼運行的隊列中。這是有效的,但是它將代碼風格引入到我的方法中,並且從用戶角度看似乎也有誤導性,因爲這些函數的調用被推遲了。另外,如果有其他用戶代碼依賴於這些調用在它們到達之前完成,它將不會按預期行事。

我一直在如何處理這種情況下我的大腦。最簡單的解決方案是找到一種方法來阻止從連接返回,直到WebSocket設置完成,但這不是真正的JavaScript方式。另一種選擇是讓他們在回調中提供其餘的代碼,但在這種情況下,這似乎是一個奇怪的事情。也許我在想這件事?

編輯:爲了更好地說明我的問題,這裏是一個什麼樣的用戶可以做一個例子:

var client = new Client(options); 
client.connect(); 
client.getServerStatus(); 

的getServerStatus()方法是內部使用WebSocket的。如果WebSocket尚未設置,用戶將得到該不可用的錯誤。

+1

如何禁用用戶interuptions,直到websocket建立?這是異步JavaScript的魔力,瀏覽器​​有時間在處理請求時刷新dom。 – Sebas

+0

如果您遇到問題,您首先嚐試併發布問題如何? – Sebastien

+0

從套接字的連接事件中調用「其他方法」,而不是從套接字初始化的同一位置調用「其他方法」... – dandavis

回答

2

今天的Javascript並不是真的那樣不幸。在將來(ECMA6),可能會有更新的語言功能更直接地解決此問題。但是現在,您仍然堅持使用當前接受的處理異步事件的方法,該方法僅限於回調。你可能還想探索'承諾'來處理'回調地獄',但是你需要一個庫。

是的,到處都有回調看起來很奇怪,特別是對於新手來說,對於網絡編程的人來說,這真的是唯一的方法去實現它(假設你需要一個跨瀏覽器友好的解決方案)。

0

「等待」幾乎就是您正在查找的關鍵字。其實,這是yield。見例如MDN's documentation

+0

要小心......支持產量有限http://kangax.github.io/ ES5-compat的表/ ES6 /#Generators_(產率) – neonstalwart

0

有,設置了WebSocket的一個connect()方法,我需要使它纔會返回WebSocket的建立後

這是不會發生的,除非你重寫JavaScript執行引擎。

試圖發送數據的代碼需要檢查套接字狀態(我會將套接字封裝在一個對象中,提供一種方法,在open/close事件中設置成員變量並輪詢來自外部代碼的那個成員變量)。或者,您可以將消息添加到隊列中,並在套接字連接時處理隊列。

相關問題