Определить, когда наблюдаемое испускает одно и то же значение дважды подряд - PullRequest
0 голосов
/ 12 октября 2018

Я использую механизм keep-alive для подключения к веб-сокету с помощью метода этот ответ :

Observable.timer(0, 5000)
  .map(i => 'ping')
  .concatMap(val => {
    return Observable.race(
      Observable.of('timeout').delay(3000),
      sendMockPing()
    );
  })

Если истекло время ожидания, мне нужно полностью сбросить подключение к веб-сокету(поскольку это, вероятно, означает, что соединение разорвано), но иногда один тайм-аут может произойти случайно (из-за плохой реализации сервера, я полагаю?)

Моя логика подписки в настоящее время реализована следующим образом

).subscribe(result => {
  if (result === 'timeout') {
    // Reconnect to server
  }
}

Есть ли способ (предпочтительно с использованием RxJ) отобразить наблюдаемое таким образом, чтобы я мог распознать случай, когда он испускал 'timeout' два раза подряд?

1 Ответ

0 голосов
/ 13 октября 2018

Вы можете использовать оператор scan, чтобы сделать то, что вы хотите:

source.pipe(
  scan((previous, next) => {
    if ((previous === 'timeout') && (next === 'timeout')) {
      throw new Error('Two consecutive timeouts occurred.');
    }
    return next;
  }, undefined);
);
...