У меня есть 2 прослушивателя событий, которые работают с одними и теми же общими данными / состоянием. Например:
let sharedState = {
username: 'Bob',
isOnline: false,
};
emitter.on('friendStatus', (status) => {
sharedState.isOnline = status.isOnline;
});
emitter.on('friendData', (friend) => {
if (sharedState.isOnline) {
sharedState.username = friend.username;
}
});
Моя проблема в том, что эти события генерируются в любом порядке. Событие friendData
может наступить до friendStatus
. Но friendData
что-то делает с данными, возвращенными из friendStatus
. Другими словами: мне нужен обработчик событий для friendData для выполнения после friendStatus, но у меня нет этой гарантии с точки зрения источника событий. Мне нужно как-то реализовать это в моем коде.
Теперь, конечно, я мог бы просто удалить if (sharedState.isOnline) {
из прослушивателя friendData
и позволить ему работать. Затем я бы запустил функцию после завершения обоих обработчиков и несколько согласовал бы зависимости общего состояния:
emitter.on('friendStatus', (status) => {
sharedState.isOnline = status.isOnline;
reconcileStateBetweenUsernameAndIsOnline();
});
emitter.on('friendData', (friend) => {
sharedState.username = friend.username;
reconcileStateBetweenUsernameAndIsOnline();
});
Проблема в том, что эта функция согласования знает об этом конкретном c случае использования зависимостей данных; следовательно, не может быть очень обобщенным c. С большими взаимосвязанными зависимостями данных это кажется намного труднее достичь. Например, я уже имею дело с другими подписками и другими зависимостями данных, и моя функция сверки становится довольно большой и сложной.
Мой вопрос: есть ли лучший способ смоделировать это? Например, если бы у меня была уверенность, что обработчики будут работать в определенном порядке c, у меня не было бы этой проблемы.
EDIT : ожидаемое поведение - использовать sharedState и рендеринг пользовательский интерфейс, в котором я хочу, чтобы имя пользователя отображалось ТОЛЬКО, если статус isOnline равен true.