Когато използвате Изпратени от сървъра събития, трябва ли клиентът да установи множество връзки, за да получава различни събития, от които се интересува, или трябва да има една връзка и клиентът посочва какво го интересува по отделен канал? IMO последното изглежда по-предпочитано, въпреки че за някои може да направи клиентския код по-сложен. Спецификацията поддържа именувани събития (събития, които се отнасят до определена тема), което според мен предполага, че връзката за изпратени от сървъра събития трябва да се използва като единичен канал за всички събития.
Следният код илюстрира първия сценарий, при който се инициират множество връзки за изпратено от сървъра събитие:
var EventSource eventSource1 = new EventSource("events/topic1");
eventSource1.addEventListener('topic1', topic1Listener, false);
var EventSource eventSource2 = new EventSource("events/topic2");
eventSource2.addEventListener('topic2', topic2Listener, false);
eventSource1 ще получи събития "topic1", а eventSource2 ще получи събития "topic2". Въпреки че това е доста просто, но също така е и доста неефективно с висящ GET, възникващ за всяка тема, от която се интересувате.
Алтернативата е нещо като следното:
var EventSource eventSource3 = new EventSource("/events?id=1234")
eventSource3.addEventListener('topic3', topic3Listener, false);
eventSource3.addEventListener('topic4', topic4Listener, false);
var subscription = new XMLHttpRequest();
subscription.open("PUT", "/events/topic3?id=1234", true);
subscription.send();
В този пример ще съществува един EventSource и интересът към конкретно събитие ще бъде посочен чрез отделна заявка с връзката на събитието, изпратено от сървъра, и регистрацията ще бъде свързана с параметъра id. topic3Listener ще получи събития "topic3", а topic4Listener не. Въпреки че се изисква малко повече код, предимството е, че се прави само една връзка, но събитията могат да бъдат идентифицирани и обработени по различен начин.
Има редица примери в мрежата, които показват използването на именувани събития, но изглежда, че имената на събитията (или темите) са известни предварително, така че не е необходимо клиент да регистрира интерес към сървъра (пример). Въпреки че все още не съм видял пример, показващ множество обекти на EventSource, също така не съм виждал пример, показващ клиент, използващ отделна заявка за регистриране на интерес към определена тема, както правя по-горе. Моята интерпретация на спецификацията ме кара да вярвам, че посочването на интерес към определена тема (или име на събитие) зависи изцяло от разработчика и че може да се направи статично, като клиентът знае имената на събитията, които ще получи или динамично, като клиентът предупреждава сървъра, че се интересува от получаване на определени събития.
Ще ми е много интересно да чуя мнението на други хора по темата. NB: Обикновено съм Java разработчик, така че моля да ме извините за посредствения ми JS код.. :)