Возврат данных асинхронным внутри emit - PullRequest
0 голосов
/ 26 августа 2018

У меня есть фоновый процесс, написанный в node.js, который использует EventEmitter, например:

var event = { returnValue: undefined };
eventEmitter.emit('name', event, argument);
return event.returnValue; // Example of doing things with event.returnValue.

Другой конец мероприятия:

eventEmitter.on('name', (event, argument) => {
    var returnValue = await asyncMethod(); // <- This method returns a Promise, so I could use await if possible or some other solution.
    event.returnValue = returnValue;
});

Я пытался найти элегантное решение для использования асинхронных методов, но поскольку EventEmitter вообще не поддерживает асинхронные функции , я не могу использовать await в функции или что-то подобное. Одним из решений может быть установка returnValue для Обещания, но это быстро становится непрактичным, особенно потому, что некоторые из моих функций выполняют многократные асинхронные функции.

Мне нужно, чтобы весь код завершился правильно, прежде чем первый блок кода продолжит работу и попытается использовать event.returnValue.

Является ли мое единственное решение использовать какую-либо стороннюю "синхронизацию", или никто в node.js не задумывался об этой проблеме?

Для меня нет особых проблем, если поток блокируется во время выполнения, так как это фоновый процесс без какого-либо графического интерфейса.

1 Ответ

0 голосов
/ 26 августа 2018

Поскольку кажется, что на самом деле не существует какого-либо интуитивного способа ожидания разрешения Promise синхронно без обратных вызовов или использования EventEmitter с асинхронными обратными вызовами, я написал свой собственный простой EventEmitter, содержащий массиви пользовательские методы on и emit.

Он правильно обрабатывает асинхронные функции, используемые в качестве параметров, поэтому я могу использовать его следующим образом:

asyncEmitter.on('name', async (event, argument) => {
    event.argument = await asyncMethod(); // Nice and clean code!
});

Конечно, я мог бы развить его дальшесоздать функцию once и так далее, но для меня я действительно зависит только от on и emit.Интересно, почему команда узлов еще не решила это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...