我看起来高低,只能找到如何编写异步函数,我已经理解了.
我想要做的是在触发事件[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;
});
});
正如您在前几行中所看到的,事件处理程序将在添加对象的data属性之前完成.
我需要的是我可以将异步功能转换为同步功能并在那里获得结果的东西.所以例如……
obj.data = somemodule.asyncFunction();
我查看了wait.for模块,异步模块,这些都不起作用.我甚至研究过yield方法,但它似乎尚未完全实现到V8引擎中.
我也尝试过使用while循环等待数据填充,但这只会带来CPU过载问题.
有没有人经历过这个并找到了一个设计模式来解决这个问题?
最佳答案 您无法在node.js中将异步函数转换为同步函数.它无法完成.
如果您有异步结果,则无法同步返回或等待它.您将不得不重新设计接口以使用异步接口(这几乎总是涉及传入将在结果准备好时调用的回调).
如果你想在你之后做一些事情.emit()一个本身会异步做某事的事件,你想等到异步事件结束后,那么事件发射器可能不是正确的接口.您宁愿进行函数调用,该函数调用返回promise或将回调作为参数.你可以操纵一个eventEmitter来使用它,但你必须在异步操作完成后回发第二个事件并让原始调用者不再执行它的第二个部分直到它收到第二个事件(这真的不是一个好方法走).
底线 – 您需要一个与异步响应(例如回调或承诺)一起使用的不同设计.