所以我目前遇到的问题是,我必须在我的小node.js项目中处理事件。
Socket.once('data', function (data) {
//a login function that handles user names
});
第二个事件
Socket.on('data', function (data) {
//function that lets user chat
});
我的问题是,当我运行它,并且客户端连接时,就会发生这种情况。
"Please Login"
*Client inputs login*
Your name is "Billtest"
Billtest says "Billtest"
Billtest says "Hi, that wasn't suppose to happen"
基本上,这两个函数最终都会运行并获得相同的输入。
我希望我的Socket.one事件先运行,Socket.on事件只在Socket.once事件完成后运行。
我试着自己弄清楚这一点,但我想由于没有明确的表达方式,我一点也不明白。我看过promise和async等等,但我似乎从来都不知道如何用我的函数来实现它。
这可能吗?如果是的话,有人能给我一个更精确的例子,告诉我如何实现异步函数,使它们按顺序运行吗?而不是一次全部?在过去的几天里,我浏览了MDN并在谷歌上搜索了一下,但我发现的例子似乎并没有真正详细解释如何设置。
我使用userName===undefined尝试了一个if语句,但两个函数最终都仍然运行。
而且我似乎无法将我所看到的任何其他解决方案包裹起来
嗨,为什么不想想简单的解决方案呢?使用不同的事件名称
// event 'user-join' handles first username thing
Socket.once('user-join', function (data) {
//a login function that handles user names
});
// event 'chat' handles chat message
Socket.on('chat', function (data) {
//function that lets user chat
});
当你发射时,你会进行socket.emit('user-join', data)
Async是解决类似问题的好选择。在您的情况下,async.waterfall
或async.series
函数应该完成此工作。
async.series([
function(callback) {
// your login function
callback(null, 'one');
},
function(callback) {
// your chat function
callback(null, 'two');
}
],
function(err, results) {
// results is now equal to ['one', 'two']
});