2017-09-21 36 views
0

我終於想在編程的這個方面達到一些清晰度,基本上是自學成才的。這與在函數之間傳遞變量有關。也許錯過了javascript編碼 - 變量處理(socket.io示例)

通過下面的代碼,data.roomId在第一個函數(顯然)中不被識別。我可以將函數放入joinRoom函數中,以使其識別data.roomId,但leaveRoom函數如何識別sendHeartbeat?

`io.on('connection', function (socket) { 
    function sendHeartbeat(){ 
     setTimeout(sendHeartbeat, 8000); 
     socket.broadcast.to(data.roomId).emit('ping', { beat : 1 }); 
    } 
    socket.on('joinRoom', function (data) { 
     socket.join(data.roomId) 
     setTimeout(sendHeartbeat, 8000); 
    }); 
    socket.on('leaveRoom', function (data) { 
     socket.leave(data.roomId) 
     clearTimeout(sendHeartbeat) 
    }); 
});` 
+0

sendHeartbeat是'函數(回調)範圍內定義' - 這樣它是在範圍內,因此(如你所說)「確認」 –

回答

1

你可以做我們所說的閉包,它是一個函數,它返回一個函數來跟蹤局部變量。這是一個很酷的概念!

function sendHeartbeat(roomId){ 
    return function() { 
     socket.broadcast.to(roomId).emit('ping', { beat : 1 }); 
    } 
} 
socket.on('joinRoom', function (data) { 
    socket.join(data.roomId) 
    setTimeout(sendHeartbeat(data.roomId), 8000); 
}); 

你調用函數sendHeartbeat傳遞的roomId,並返回你想在你的setTimeout :)要執行的功能

+0

好吧,很高興知道!猜測我將在未來測試它,但現在我已經離開ping來保持socket.io連接打開,並使用https://www.npmjs.com/package/express-socket.io設置會話cookie。 -session – MikeyB