Promisify Socket.IO / EventEmitter

我有点惊讶的是,当我在Promisify Socket.IO上search时找不到多less东西。 这是不是罕见的?

我也有麻烦,自己promisify它:

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

这总是触发错误的情况下,我假设,因为.once是一个callback只有一个参数,其中承诺希望第一个是错误。 任何想法如何处理这些事情?

我可以想到为什么承诺与socket.io和EventEmitter接口不太吻合的一些原因:

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

  2. Promise.promisifyAll()需要node.js风格的asynchronouscallback函数(错误值作为第一个参数,数据作为第二个参数),而不是任何socket.io事件处理函数的callback函数。 为了使承诺能够像connect事件一样工作,你必须编写你自己定制的promsification,这可能比仅仅使用事件处理器写的更有效。

上述例外情况可能是,如果您试图将下一次发生的事件与其他asynchronous事件(通常不常做的事情)进行协调,在这种情况下,承诺可能对协调有用。 举一个例子,假设你想知道三个单独的asynchronous操作何时完成,其中一个是下一个socket.io事件。 那么,手动promisify该事件可能是有意义的,所以你可以使用promise来协调你的多个asynchronous操作。

但是,对于正常的socket.io使用,承诺并不是一个好的架构适合。 同样,您通常不会在网页中使用承诺作为点击处理程序。


仅供参考,如果你只是想让promisify只是connect操作,你可以这样做,手动:

 io.connectAsync = function(url, options) { return new Promise(function(resolve, reject) { io.connect(url, options); io.on('connect', function(socket) { resolve(socket); }); io.on('connect_error', function() { reject(new Error('connect_error')); }); io.on('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 });