- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
令我感到惊讶的是,我在谷歌上搜索 Promisify Socket.IO 时并没有找到太多。有那么罕见吗?
我自己也难以 promise :
Promise.promisifyAll(io)
io.onceAsync('connect')
.then((socket) => ...)
.catch((err) => console.log(error))
这总是触发错误情况,我假设是因为 .once
是一个只有一个参数的回调,其中 Promises 期望第一个参数是错误。知道如何处理这类事情吗?
最佳答案
我能想到 promises 不适合 socket.io 和 EventEmitter
一般接口(interface)的几个原因:
在大多数情况下,socket.io 是一个事件驱动的接口(interface),并且 promises 在架构上与可能多次发生的事件不一致(因为 promise 是一次性设备)。是的,您可以对 .connect()
使用 promise ,但不能对传入消息使用 promise 。所以,大多数人(包括我自己)可能认为一半接口(interface)使用 promises 而另一半接口(interface)使用事件处理程序没有意义。对整个 API 使用一种模型可能更好。
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/
我已经尝试了很长时间自己解决这个问题,但找不到适合我的问题的解决方案。 我有这个方法: handle_database = function(callback, req, res) { pool.ge
我差点把问题标题写成 - Communicating between eventEmitters 我有一个全局范围内的 node.js 模块 (X)(它使用 eventEmitter)。然后我有每个套
我正在尝试从一个 EventEmitter 发射到另一个 EventEmitter,或者寻找替代解决方案。下面的代码不起作用。 多发射器示例 var events = require('events'
有很多示例在自定义事件发射器构造函数中未使用 events.EventEmitter.call(this),而其他示例正在使用它 (official documentation): var event
假设我有这段代码: export class ProductsListComponent { @Output() onProductSelected: EventEmitter; constr
有时我们会遇到泛型变量应该被省略的情况。像这样: @Component( ... ) class MyComponent { @Output() public cancel = new Eve
我想做这样的事情: var events = require("events"); var emitterA = new events.EventEmitter(); var emitterB = n
EventEmitter.emit() 和 EventEmitter.next() 有什么区别?两者都将事件分派(dispatch)给订阅的监听器。 export class MyService {
我是 angular2 的新手,我对使用 EmitterService 的 EventEmitter 感到困惑,任何人都可以向我解释 Emitter 的用途。 在不使用@input 和@output
我正在学习 Node.js,对自定义 EventEmitter 有一些困惑。代码如下: var events = require("events"); function MyEmitter (name
如标题所述,我想用 TypeScript 重写下面的语句 EventEmitter = require('events').EventEmitter ES6风格 import {EventEmitte
obj.prototype.__proto__ = events.EventEmitter.prototype 我有时会看到上面的代码,我用谷歌搜索了一下,他们说这一行将所有 EventEmitter
我创建了一个抽象父类(super class)来处理我应用中各种表单组件的通用因素。 出于某种原因,我无法正确捕获由在父类(super class)中声明了 EventEmitter 的派生类发出的事
我尝试将表单从我的子组件传递给他的父组件。 child TS: @Output() submit: EventEmitter = new EventEmitter(); updateStream():
这真的很奇怪,也很难解释。 我用过EventEmitter在我的一些服务中,我一直在使用它来更改我的 View 数据。 我遇到了更改路线(通过链接或通过历史返回)的问题,它似乎被多次触发,因此它搞乱了
我正在开发一个 Angular2 组件,它使用网络摄像头将图片捕捉到 Canvas 元素,并将其提取为 Blob。 Blob 和事件分别正常工作,但是当我尝试从 toBlob 的回调函数内发出事件时,
当我有一个带有选择器'recursive-element'的模板时,它的模板看起来像这样 在我定义的类中 greetEvent = new EventEmitter
我非常喜欢将函数导出为 JavaScript 模块的主要 API 的模式。原因是在 JS 中,函数基本上可以做典型对象可以做的任何事情,然后再做一些。 所以这对我来说很典型: function stu
我有这个 Node js脚本: var EventEmitter = require('events').EventEmitter, util = require('util'); var p
在事件生成后附加事件处理程序有一个看似众所周知的问题。这主要是在调用遵循返回 EventEmitter 模式的函数时出现的问题,例如: var EventEmitter = require('even
我是一名优秀的程序员,十分优秀!