2014-02-18 28 views
0

目的:爲了提供一個簡單易用的與庫服務器通信的JS庫,我試圖在API開始時建立一個WebSocket連接,之後定義庫的功能。在JS內部建立WebSocket連接併爲其創建一個JS API

問題:的問題是,我的套接字的readyState不過渡到1(就緒)之前庫加載和用戶的腳本運行。調試這已經證實了這一點,我不知道如何確保我的WebSocket在繼續用戶腳本之前建立。

我有什麼:

(function(myObject) { 

var socket = new WebSocket(url); 

socket.emit = function() { 
    //do some tasks and create a var "message" 
    socket.send(message); 
} 

window.myObject = myObject.prototype = { 
    doSomething: function() { 
     socket.emit(); 
    } 
} 

}(myObject = window.myObject || {})); 

上面,我Socket對象,反過來,socket.send調用上定義的自定義方法(socket.emit())()。我這樣做是爲了在通過socket.send()發送數據之前處理一些數據,重複使用否則會重複的代碼。

然後,我有包括該JS庫和一個簡單的腳本運行如下一些非常基本的html:

$(document).ready(function() { 
    myObject.doSomething(); 
}); 

我得到的錯誤是:「無法執行‘發送’ON‘的WebSocket’:已在連接狀態「。

該庫成功加載,但Websocket在客戶端腳本運行之前未完成連接。在API完成加載之前,如何確保我的WebSocket已連接(readystate == 1)?

感謝您的幫助!

+0

您正在運行doSomething準備就緒的文檔,但連接尚未準備就緒。您應該查看可用於連接的事件(onOpen,onClose,onMessage,onError)並重構您的呼叫,以便連接準備好發送消息。 – NaNpx

+0

沒錯,但最終我不會是編寫將調用庫的腳本的人。我想在幕後處理所有套接字業務,以便最終用戶可以簡單地撥打他們想要的電話。 – user24824

回答

0

只要套接字未連接,您可以做的就是緩衝socket.emit中的所有消息,並在收到onOpen回調後發送它們。

雖然這將處理您當前的問題,您將看到將出現新問題: 您可能希望處理與服務器的斷開連接並重新連接,因此您可能需要擴展您的庫API,以便也暴露連接狀態更改事件和強制庫用戶只在連接時發送消息。