2017-08-01 98 views
0

對不起,這可能是一個非常不好的問題,可能已經被問到了。然而,我找不到回答我的具體問題的帖子,所以我仍然在那裏問。爲什麼我無法在cordova中訪問全局JS變量?

請注意,我完全是JavaScript的新手,我來自面向對象的編程語言。在回答時請保持在明!

我想讓我的科爾多瓦應用程序連接到websocket服務器。由於我的應用程序只適用於Android 4.4及以上版本,我想出了使用javascript的window.WebSocket對象是一個好主意。因此,我創建一個像這樣的「全局」變量:

var socket = null; 
var app = { 
    initialize: function() { 
    document.addEventListener('deviceready', this.onDeviceReady.bind(this), false); 
    ... 
} 

我可以使用下面的代碼成功地創建的WebSocket對象:

websocketSetup: function() { 
    var serverUrl = "ws://echo.websocket.org"; 
    var logdiv = document.getElementById("logs"); 
    //Called when the client opents the conection to the server 
    var onOpen = function() { 
     logdiv.innerHTML += "<p class='purple'>Websocket opened: " + serverUrl + "</p>"; 
     socket.send("Hello");//FIXME: remove this line 
    }; 
    //Called when the client or the server drops the connection, or sends a close request 
    var onClose = function() { 
     logdiv.innerHTML += "<p class='purple'>Websocket closed.</p>"; 
     socket = null; 
    }; 
    //Called when the client recieves a request from the server 
    var onMessage = function(event) { 
     logdiv.innerHTML += "<p class='purple'>Message:" + event.data + "</p>"; 
    }; 
    //Called from the client websocket implementation when an error happens 
    var onError = function(event) { 
     logdiv.innerHTML += "<p class='purple'>" + event.data + "</p>"; 
    }; 
    try{ 
     socket = new WebSocket("ws://echo.websocket.org"); 

       socket.onopen = onOpen; 
       socket.onclose = onClose; 
       socket.onmessage = onMessage; 
       socket.onerror = onError; 
    }catch(e){ 
     logdiv.innerHTML += "<p class='red'>" + e + "</p>"; 
    } 
}, 

這一切正常,我成功地從回聲獲得回聲websocket服務器。 但是,我無法再訪問此套接字變量了。功能,如:

socketMessage: function(outgoingmessage) { 
    socket.send(outgoingmessage); 
    var logdiv = document.getElementById("logs"); 
    logdiv.innerHTML += "<p class='purple'>Message sent to WS:" + outgoingmessage + "</p>"; 
} 

根本不起作用,只要我指的是插座變量,函數停止它的執行。它也不會拋出我可以嘗試/捕捉的異常。

感謝您的幫助!

回答

1

嗯,我發現這個問題,這主要是由於我對JavaScript的不瞭解。

應用程序初始化後,套接字變量不再存在,因爲它沒有正確設置爲全局變量。

socket = null; 

此代碼將添加插座變量作爲全局對象的屬性,將使其持續性和可訪問來自世界各地。