簡體   English   中英

socket.io:如何從對象動態調用套接字方法?

[英]socket.io : How do I call upon my socket methods dynamically from an object?

我有這個:

io.sockets.on('connection', function(socket) {
    socket.on("action1", function(data){
        socket.emit("action1", data);
    });
    socket.on("action2", function(data){
        socket.emit("action2", data);
    });
    socket.on("action3", function(data){
        socket.emit("action3", data);
    });
});

我要這個:

var socketMethods = {
    action1:function(data, socket){
        socket.emit("action1", data);
    },
    action2:function(data, socket){
        socket.emit("action2", data);
    },
    action3:function(data, socket){
        socket.emit("action3", data);
    }
}

io.sockets.on('connection', function(socket) {
    for(key in socketMethods){
        socket.on(key, socketMethods[key]);
    }
});

但是,我無法將套接字傳遞給方法,最終我得到了

C:\__server\nodejs.js:217
    socket.emit('action1', {msg:"No account"}
               ^
TypeError: Cannot call method 'emit' of undefined

我試圖通過函數傳遞套接字:

io.sockets.on('connection', function(socket) {
    for(key in socketMethods){
        socket.on(key, function(data, socket){
            socketMethods[key](data, socket);
        });
    }
});

套接字不會傳遞給函數。

如何動態調用方法,並且仍然能夠在方法內使用套接字?

更新:

使用此精確代碼:

io.sockets.on('connection', function(socket) {
    for(key in socketMethods){
        socket.on(key, function(data){
            socketMethods[key](data, socket);
        });
    }
});

我發現了一些非常有趣的東西。

它確實起作用,並且我可以從該方法中運行socket.emits!

但是,現在,它只運行LAST方法。 在這種情況下,無論要求什么,都將調用action3。 如果要求動作1或動作2,則仍將調用動作3。

更新:

運行console.log(socket._events),我發現附加了以下函數錯誤:[function],action1:[function],action2:[function],action3:[function]。 當我嘗試查看每個功能的內容時,我所得到的只是。

function ack() {
      self.packet({
          type: 'ack'
        , args: io.util.toArray(arguments)
        , ackId: packet.id
      });
    }

不管我發回什么功能。 我還將action2設置為對象中的最后一件事,而action2就是所謂的。 然而。 當我以正常方式附加socket.on方法時,它們在socket._events中看起來完全一樣。

我有一個理論,所有方法都被“最后一個” action(action3)覆蓋。

無法入睡

我犯的一個大錯誤是,我在假定循環數據將始終存在的情況下嘗試發送該函數。 相反,我收到了關鍵數據的參考。

我將需要做更多的研究,但相反,我們需要創建一個函數

由於有這篇文章,所以想通了這個,多虧了ebohlman

socket.io使用for循環添加socket.on方法

function makeOn(key) {
  return function(data) {
    dummy.socketMethods[key].call(socket, data);
  }
}

for(key in dummy.socketMethods){
  socket.on(key, makeOn(key));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM