【发布时间】:2018-03-30 22:58:40
【问题描述】:
我正在尝试在 EventEmitter 事件被触发时解决一个 Promise。
包含函数接受一个参数并将其添加到堆栈中。然后将项目从堆栈中取出以进行任意处理,并触发 success 或 error 事件。
public async processData(payload: Payload) {
// Push data onto a stack
this._myStack.push(payload);
return new Promise((resolve, reject) => {
myEventEmitter.on('processSuccess', data => {
resolve(data);
});
myEventEmitter.on('processError', error => {
reject(error);
});
});
}
问题是每次将项目添加到堆栈时都会添加一个新侦听器。这意味着当processSuccess 或processError 事件被触发时,承诺将为堆栈上的每个项目返回。
示例:如果堆栈上有 11 个项目,并且发出 processSuccess,则 data 将返回 11 次。
当其中一个事件被发出而不返回堆栈上的每个项目时,有没有办法解决承诺?也就是说,如何在不为每个事件创建一堆事件监听器的情况下做到这一点?
【问题讨论】:
-
什么逻辑确保处理堆栈项的完成按照它们被推入堆栈的顺序发生?也就是说,你怎么知道一个事件是针对什么有效载荷发出的?
-
从栈顶获取数据,处理,完成事件,然后弹出。
peek()process()emit()pop()。返回的有效负载本身中有识别信息。myEventEmitter.emit('processSuccess', data); -
在将有效负载推送到堆栈后,代码似乎等待处理成功或失败 - 多个有效负载如何同时进入堆栈或者我错过了什么?
-
如果我用 5 个不同的参数调用这个方法 5 次,那么它会将所有 5 个参数添加到堆栈中。当用户选择处理它时,堆栈上的项目的实际处理发生(为简单起见从示例中删除)。此时,
processSuccess或processError会被发出,并且已处理的项目(用户选择对其执行操作的项目)被移除,并且用户可以选择对堆栈中的下一个项目执行操作。 -
知道了。
return await new Promise(async ....)让我感到困惑 - 它不需要在执行程序中使用await运算符或async声明。
标签: javascript node.js typescript promise eventemitter