簡體   English   中英

有沒有辦法將 socket.io 事件放入函數中?

[英]Is there a way to put socket.io events into functions?

我想將 socket.io 事件封裝到函數中,以使其對我的項目更具可讀性,這是一個示例。 我試圖把這個:

io.on('connection', (socket) =>{
            //code
});

變成這樣:

function isThereANewConnection() {
 io.on('connection', (socket) =>{
        //..return true?
 });
}

function update() {
   if(isThereANewConnection()) {
    //do something with the socket data..
  }
}

我似乎無法弄清楚如何實現這一點,因為我無法從 function 返回一些東西。 有誰知道如何做到這一點?

我認為這不會以對您更易讀和更有用的方式來構建您的代碼。 但是如果你確實想要這個,你可以使用async/await

async function getNewConnection() {
  return await new Promise((resolve, reject) => {
    io.on('connection', resolve);
  });
}

然后在您的其他代碼中:

const socket = await getNewConnection();

但實際上,對於這個連接處理程序,您應該堅持使用回調模式。 它使您的事情變得簡單。 當連接進入時運行您的更新,而不是相反。

您還沒有真正解釋通過將“事件放入函數”來實現的目標,因此很難准確地知道您希望它是什么樣子。

從本質上講,nodejs 是一個事件驅動的環境。 因此,您注冊事件偵聽器並在發生事件時呼叫您。 這就是 socket.io 連接事件的結構。

如果您不希望所有內容都內聯,例如:

io.on('connection', (socket) =>{
            //code
});

您可以將事件偵聽器回調放入 function 本身,例如:

io.on('connection', onConnection);

然后,在其他地方(在同一模塊中或導入到此模塊中),您將定義onConnection function。

function onConnection(socket) {
    // put your code here to handle incoming socket.io connections
    socket.on('someMsg', someData => {
        // handle incoming message here
    });
}

注意:內聯回調函數(您似乎要求避免的類型)在 nodejs 編程中非常常見。 使用它們的原因之一是,當它們內聯時,它們可以使用來自父 scope 的所有變量(無需將它們全部作為參數傳遞),有時這非常有用。 所以,它可能是一種你會發現有用而不是避免的風格。

更新:我已經找到了 OOP 解決方案(這不是最好的):

class ConnectionHandler {

init() {
  this.listenForConnections();
}

listenForConnections() {
 io.on('connection', (socket) =>{
        //do stuff
        this.newConnection = true;
        this.update();
 });
}

// the update method contains all the logical decisions of a class
update() {
   if(this.isThereANewConnection()) {
    //add connection to list.. or handle the rest of the logic
  }
  //render screen
}

isThereANewConnection() {
   if(this.newConnection) {
    this.newConnection = false;
    return true;
  }
 return false;
}

}

暫無
暫無

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

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