Я выглядел высоко и низко, и я могу только найти, как писать асинхронные функции, которые я уже понимаю.Ожидание асинхронного метода в NodeJS
То, что я пытаюсь сделать, это запустить метод async в запущенном событии [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;
});
});
Как вы можете видеть в последних строках, обработчик события завершится до того, как добавлено свойство данных объекта.
Что мне нужно - это то, где я могу превратить функцию async в функцию синхронизации и получить результаты там и тогда. так, например ...
obj.data = somemodule.asyncFunction();
Я смотрел на wait.for
модуль, в async
модуль, и ни один из них не будет работать. Я даже заглянул в метод yield
, но, похоже, он еще не полностью внедрен в двигатель V8.
Я также пробовал использовать цикл while
слишком долго, чтобы данные заполнили, но это просто приносит с собой проблему перегрузки процессора.
Кто-нибудь испытал это и нашел шаблон дизайна, чтобы обойти это?
также , Я не могу покончить с моделью EventEmitter, так как я использую это для модулей для присоединения к crud-функциям для модульности. –
В CPS вы не можете избежать вложенных обратных вызовов. С обещаниями вы можете упорядочить код немного более линейно. С генераторами (выход) вы можете написать синхронно выглядящий код. В любом случае, когда вы идете асинхронно, пути назад нет, вы в основном оказались в асинхронном мире. – elclanrs
Слушатели событий ** не ** называются синхронно. –