这是我的客户端websocket代码,它创建一个eventManager实例并调用一个方法。
var WebSocket = require('ws');
var eventManager = (function(){
eventManager.prototype.wsConnection = new WebSocket('ws://localhost:8081');
//Constructor to initialize the connection.
function eventManager(){
//Open connection on send port.
this.wsConnection.on('open', function() {
console.log('Connection opened');
});
}
eventManager.prototype.sendMessage = function(message){
console.log(message);
this.wsConnection.send(message); //Send message to websocket server
}
return eventManager;
})();
//create instance
var eventManagerObj = new eventManager();
//call method
eventManagerObj.sendMessage("Hi to websockets");
当我创建实例并调用sendMessage
方法时,似乎构造函数中的代码在方法调用之后执行。我希望构造函数中的代码首先执行以初始化连接而不是发送message.Any建议?
答案 0 :(得分:0)
不太确定你的问题是什么,但它可能与进入函数执行上下文时发生的事情有关。
这里相关的事情是首先解析所有代码,然后实例化用 var 声明的所有变量(但不进行赋值),然后处理所有函数声明,然后执行代码开始。所以在函数表达式中:
var eventManager = (function(){
eventManager.prototype.wsConnection = new WebSocket('ws://localhost:8081');
function eventManager(){
...
}
函数声明表示在执行任何代码之前创建函数。创建函数时,默认情况下它具有 prototype 属性,因此在进行赋值之前, eventManager.prototype 位于上一行。
逻辑顺序就好像所有变量声明都被移动到函数的顶部,紧接着是所有函数声明,但是赋值保留在它们所在的位置。所以:
// do stuff
function x(){}
var a = 3;
处理为:
var a;
function x(){}
// do stuff
a = 3;
这也称为“吊装”,但这不是我喜欢的术语。
OP中不需要IIFE。通常它们用于闭包并保护不应公开暴露的方法和变量,但OP不会将其用于此。所以它可以写成:
function eventManager() {
//Open connection on send port.
this.wsConnection.on('open', function() {
console.log('Connection opened');
});
}
eventManager.prototype.wsConnection = new WebSocket('ws://localhost:8081');
eventManager.prototype.sendMessage = function(message){
console.log(message);
this.wsConnection.send(message); //Send message to websocket server
}
//create instance
var eventManagerObj = new eventManager();
//call method
eventManagerObj.sendMessage("Hi to websockets");
它还以更接近于逻辑处理方式的顺序呈现代码。
答案 1 :(得分:0)
this.wsConnection.on('open', function() {
console.log('Connection opened');
将在打开连接时记录。
eventManager.prototype.sendMessage = function(message){
console.log(message);
this.wsConnection.send(message); //
记录消息,然后打开一个触发wsConnection onOpen的连接,以便消息在" connection opened"之前记录。构造函数在sendMessage之前执行,但open事件在sendMessage中触发。
如果要证明构造函数代码在sendMessage之前执行,则可以添加另一个日志:
function eventManager(){
console.log("adding event listener for wsConnection.open");
//Open connection on send port.
this.wsConnection.on('open', function() {
console.log('Connection opened');
});
}