gpt4 book ai didi

node.js - Socket.io异步/等待.on()

转载 作者:行者123 更新时间:2023-12-03 12:07:10 25 4
gpt4 key购买 nike

我正在构建一个socket.io Node JS应用程序,我的socket.io服务器将监听来自许多socket.io客户端的数据,我需要尽快通过我的socket.io服务器将数据保存到API,并弄清楚异步/等待是最好的方法。
现在,我的.on('connection')中有一个函数,但是有什么方法可以使它成为异步函数,而不是在其中嵌套函数?

io.use((socket, next)  => {

if (!socket.handshake.query || !socket.handshake.query.token) {
console.log('Authentication Error 1')
return
}

jwt.verify(socket.handshake.query.token, process.env.AGENT_SIGNING_SECRET, (err, decoded) => {
if (err) {
console.log('Authentication Error 2')
return
}
socket.decoded = decoded
next()
})

}).on('connection', socket => {
socket.on('agent-performance', data => {
async function savePerformance () {
const saved = await db.saveToDb('http://127.0.0.1:8000/api/profiler/save', data)
console.log(saved)
}
savePerformance()
})
})

最佳答案

有点,但是如果可能有多个agent-performance事件,您可能想要保留当前代码。您可以修改以下内容,但会造成困惑且可读性较差。事件发射器仍然存在是有原因的,没有因引入 promise 而使它们过时。如果您追求的是性能,那么您当前的代码可能更快,更耐背压并且更易于处理错误。

events.on 是一个实用程序函数,它接受事件发射器(如socket)并返回产生promise的迭代器。您可以使用for await of等待。
events.once 是一个实用程序函数,它接受事件发射器(如socket)并返回一个在执行指定事件时解析的promise。

const { on, once } = require('events');

(async function() {
// This is an iterator that can emit infinite number of times.
const iterator = on(io, 'connection');
// Yield a promise, await it, run what is between `{ }` and repeat.
for await (const socket of iterator) {
const data = await once(socket, 'agent-performance');
const saved = await db.saveToDb(/* etc */);
}

})();
顾名思义, on类似于 socket.ononce类似于 socket.once。在上面的示例中:
  • 已连接用户1,第一次代理性能事件:OK
  • 已连接用户1,第二个代理性能事件:未处理,没有其他事件处理程序,因为once已“用完”。
  • 已连接用户2,第一次代理性能事件:OK
  • on的文档中有关于使用 for await (x of on(...))时并发性的说明,但我不知道这在您的用例中是否会出现问题。
        // The execution of this inner block is synchronous and it
    // processes one event at a time (even with await). Do not use
    // if concurrent execution is required.

    关于node.js - Socket.io异步/等待.on(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65994459/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com