【发布时间】:2015-12-21 15:15:30
【问题描述】:
我高高在上,只能找到如何写异步函数,我已经明白了。
我正在尝试做的是在触发事件 [EventEmitter] 中运行异步方法,但这样简单的事情似乎根本不可能,因为我能找到。
考虑以下...
// Your basic async method..
function doSomething(callback) {
var obj = { title: 'hello' };
// Fire an event for event handlers to alter the object.
// EvenEmitters are called synchronously
eventobj.emit('alter_object', obj);
callback(null, obj);
}
// when this event is fired, I want to manipulate the data
eventobj.on('alter_object', function(obj) {
obj.title += " world!";
// Calling this async function here means that our
// event handler will return before our data is retrieved.
somemodule.asyncFunction(callback(err, data) {
obj.data = data;
});
});
正如您在最后几行中看到的,事件处理程序将在添加对象的数据属性之前完成。
我需要的是可以将异步函数转换为同步函数并在那里得到结果的东西。比如……
obj.data = somemodule.asyncFunction();
我查看了wait.for 模块、async 模块,这些都不起作用。我什至研究过 yield 方法,但它似乎还没有完全实现到 V8 引擎中。
我也尝试过使用 while 循环来等待数据填充,但这只会带来 CPU 过载问题。
有没有人经历过这种情况并找到一种设计模式来解决这个问题?
【问题讨论】:
-
另外,我不能取消 EventEmitter 模型,因为我将它用于模块以附加到 crud 函数中以实现模块化。
-
在 CPS 中,您无法逃避嵌套回调。使用 Promise,您可以更线性地组织代码。使用生成器(yield),您可以编写同步的代码。无论如何,当你去异步时,没有回头路,你基本上被困在异步世界中。
-
事件监听器不被同步调用。
-
@elclanrs,害怕那个......令人困惑的是他们呈现的 EventEmitter 是同步的。我很想坚持使用回调方法,但我真的需要事件方法来匿名连接来自其他模块(基本上是一个钩子系统)。运行回调系统的设计模式怎么样,也许我可以通过 next() 作为我在 emit() 中的最后一个参数
-
可能对stackoverflow.com/questions/32010458/… 或stackoverflow.com/questions/24170530/… 感兴趣。此外,虽然“yield”已完全实现,但它只是以类似同步的方式编写异步函数的解决方案的一部分。
标签: javascript node.js asynchronous eventemitter