Остановить интервал при пустом массиве

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

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

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 ответа

Решение

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

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

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

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

Ты можешь использовать takeWhile чтобы завершить поток:

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

когда messages пусто возвращает undefined который false когда обратился к логическому так takeWhile(Boolean) завершит поток.

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