В JavaScript шаблон наблюдателя используется довольно часто. В этом есть одна сложная вещь, и это ссылки, которые хранит наблюдатели. Они требуют очистки. Для обычных приложений я использую следующие эмпирические правила:Является ли функциональное реактивное программирование в JavaScript причиной больших проблем со ссылками слушателя?
- Если объект имеет срок службы короче (или равно) наблюдатель, я могу просто сделать
subject.on('event', ...)
- Если объект имеет срок службы больше чем наблюдатель, мне нужно использовать
observer.listenTo(subject, 'event', ...)
Во втором случае listenTo
знает о жизненном цикле наблюдателя, и он будет автоматически удалять слушателей, когда пришло время для наблюдателя, чтобы умереть.
В современном стиле SPA (Single Page Application), где в любой момент активны только части приложения, это становится очень важным. Если вы объедините это с веб-сокетами, которые являются идеальным кандидатом на поток событий и, скорее всего, долговечны, это становится еще более важным.
С FRP, имеющим нечто вроде потока событий, представляющего изменяющиеся значения с течением времени, я (не зная об этом) создаю много слушателей. Каждый filter
, map
и flatMap
создает новый поток, связанный (возможно, с прослушивателем) с предыдущим.
На мой взгляд, кажется довольно сложным определить, как и когда мне нужно удалить этих слушателей. Я не могу представить, чтобы я был первым, кто подумал об этой проблеме, но я не мог найти много об этом в Интернете.
Я видел, что некоторые фреймворки на других языках используют слабые ссылки. JavaScript не имеет понятия слабых ссылок (WeakMap здесь не используется). Даже если бы это имело хотя бы, это кажется плохой идеей, потому что неясно, когда происходит сбор мусора.
- Как это можно решить в современных рамках?
- Связаны ли рамки с жизненным циклом объектов? Если да: как?
Если вы считаете, что этот вопрос должен быть закрыт, пожалуйста, добавьте комментарий. Возможно, добавьте предложение, чтобы сделать вопрос более конкретным. Или, может быть, указатель на место, где этот вопрос лучше подходит. Если неясно, задайте вопросы. Я действительно хочу использовать FRP. – EECOLOR
Извините, что мне пришлось голосовать, чтобы закрыть. Этот вопрос слишком открытый. –
@JK. Есть ли у вас предложения по улучшению вопроса? – EECOLOR