[英]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.