Остановить интервал при пустом массиве - PullRequest
0 голосов
/ 05 марта 2019

Я получаю кучу сообщений со стороны сервера и хочу подделать набор текста, добавив интервал в канал.

Я делаю это сейчас:

const stream = interval(1000)
  .pipe(
  map((): Message => {
    return messages.pop();
  })
);

this.feed = merge(
  stream,
  this.local
).pipe(
  scan((acc, x) => [...acc, x], [])
);

Но я хочу, чтобы он остановил интервал, когда мой массив 'messages' пуст, может кто-нибудь помочь мне, пожалуйста?Я пытался реализовать .TakeWhile безуспешно.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Итак, ваша проблема в том, что stream продолжает излучать даже после того, как messages пуст.

Вы можете использовать takeWhile для завершения потока:

const stream = interval(1000).pipe(
  map((): Message => messages.pop()),
  takeWhile(Boolean),
);

Когда messages пусто, возвращает undefined, то есть false при обращении к логическому значению, поэтому takeWhile(Boolean) завершит поток.

0 голосов
/ 05 марта 2019

takeWhile работает отлично, вам нужно что-то вроде этого:

const stream = interval(1000)   
  .pipe(
     takeWhile(() => messages.length > 0),
     map(() => messages.pop()),   
  );

Я сделал небольшой пример на stackblitz, надеюсь, вы можете использовать это в своем приложении: https://stackblitz.com/edit/typescript-sq6wxb?file=index.ts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...