gpt4 book ai didi

javascript - promise Socket.IO/EventEmitter

转载 作者:搜寻专家 更新时间:2023-10-31 22:55:33 26 4
gpt4 key购买 nike

令我感到惊讶的是,我在谷歌上搜索 Promisify Socket.IO 时并没有找到太多。有那么罕见吗?

我自己也难以 promise :

Promise.promisifyAll(io)
io.onceAsync('connect')
.then((socket) => ...)
.catch((err) => console.log(error))

这总是触发错误情况,我假设是因为 .once 是一个只有一个参数的回调,其中 Promises 期望第一个参数是错误。知道如何处理这类事情吗?

最佳答案

我能想到 promises 不适合 socket.io 和 EventEmitter 一般接口(interface)的几个原因:

  1. 在大多数情况下,socket.io 是一个事件驱动的接口(interface),并且 promises 在架构上与可能多次发生的事件不一致(因为 promise 是一次性设备)。是的,您可以对 .connect() 使用 promise ,但不能对传入消息使用 promise 。所以,大多数人(包括我自己)可能认为一半接口(interface)使用 promises 而另一半接口(interface)使用事件处理程序没有意义。对整个 API 使用一种模型可能更好。

  2. Promise.promisifyAll() 需要 node.js 风格的异步回调(错误值作为第一个参数,数据作为第二个参数),这不是任何套接字.io 事件处理程序回调使用。要使 promises 与诸如 connect 事件之类的东西一起工作,您必须编写自己的自定义 promsification,这可能比仅使用为其编写的事件处理程序更有效。

上述情况的一个异常(exception)情况可能是,如果您试图协调下一次事件与其他异步事件(通常不做的事情),在这种情况下,promises 可能对协调有用。例如,假设您想知道三个独立的异步操作何时全部完成,其中一个是下一次发生 socket.io 事件。然后,手动 promise 该事件可能是有意义的,这样您就可以使用 promise 来协调您的多个异步操作。

但是对于正常的 socket.io 使用,promises 并不是一个很好的架构。同样,您通常不会将 promise 用于网页中的点击处理程序。


仅供引用,如果您只想 promise connect 操作,您可以像这样手动执行此操作:

io.connectAsync = function(url, options) {
return new Promise(function(resolve, reject) {
io.connect(url, options);
io.once('connect', function(socket) {
resolve(socket);
});
io.once('connect_error', function() {
reject(new Error('connect_error'));
});
io.once('connect_timeout', function() {
reject(new Error('connect_timeout'));
});
});
}


io.connectAsync().then(function(socket) {
// connected here
socket.on('someMsg', function() {
// process message here
});
}, function(err) {
// error connecting here
});

关于javascript - promise Socket.IO/EventEmitter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37365268/

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