为什么我不能访问cordova中的全局JS变量?

时间:2017-08-01 12:56:30

标签: javascript cordova

对不起,这可能是一个非常无聊的问题,可能已经被问过了。然而,我找不到回复我的具体问题的帖子,所以我仍然在那里问。

请注意,我是javascript的新手,我来自面向对象的编程语言。请回答时请保持这种状态!

我希望我的cordova应用程序连接到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>";
    }
},

这很好用,我成功地从echo websocket服务器获得了回声。 但是,之后我再也无法访问此套接字变量了。功能如:

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

根本不起作用,只要我引用套接字变量,该函数就会停止它的执行。它也没有抛出我可以尝试/捕获的异常。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

好吧,我发现了问题,主要原因是我对javascript知之甚少。

应用程序初始化后,套接字变量不再存在,因为它未正确设置为全局变量。

socket = null;

此代码将socket变量添加为全局对象的属性,并使其持久且可从任何位置访问。