Первый и второй обработчик подписки Observer

У меня есть такой код:

const i = 0;
const subject = webSocket(WEBSOCKET_API_URL);

subject.subscribe(
  msg => {
    if (i===0) {
      firstHandler();
    }
    if (i===1) {
      secondHandler();
    }
    else {
      globalHanlder();
    }
    if (i <= 2) { 
      i++;
    }
  }
);

subject.next({
  event: "testSubscribe",
});

Я хочу подписаться на канал WebSocket, отправить сообщение и обработать 2 первых ответа иначе, чем другие.

Я сделал это, как вы можете видеть выше. Мне не нравится решение. И мне интересно, есть ли какой-нибудь более красивый способ сделать это для обработки первого и второго вызова функции с использованием rxjs.

есть предложения?

Альтернативные WebSockets для netty/java: удвоение пропускной способности небольших сообщений
Альтернативные WebSockets для netty/java: удвоение пропускной способности небольших сообщений
Этот пост - краткая презентация netty-websocket-http1 - альтернативной netty/java реализации RFC6455 - протокола WebSocket.
Очень простая установка Websocket с помощью Deno без каких-либо пакетов
Очень простая установка Websocket с помощью Deno без каких-либо пакетов
Здесь мы рассмотрим, как можно использовать Websocket в Deno и развернуть его в Deno deploy. Мы будем слушать Websocket, а также отправлять сообщения.
0
0
28
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что ваше решение в порядке. Не обязательный очиститель с оператором Observable, но следующее сделает то же самое.

const 1st=subject.pipe(take(2),last(),tap(()=>firstHandler()))
const 2nd=subject.pipe(first(),tap(()=>secondHandler()))
const other=subject.pipe(skip(2),tap(()=>globalHandler()))
merge(1st,2nd,other).subscribe()
Ответ принят как подходящий

Лично я сделал бы это почти так же, как это сделали вы. Может быть, я предпочел бы, чтобы переменная i была определена внутри цепочки. Возможно, если вам не нужны значения, испускаемые subject, вы можете заменить их индексами.

subject.pipe(
  map((value, index) => index),
).subscribe(index => {
  if (index === 0) {
    firstHandler();
  } else if (index === 1) {
    secondHandler();
  } else {
    globalHanlder();
  }
});

Другие вопросы по теме