空数组时停止间隔

Stop interval when empty array

我从服务器端收到一堆消息,我想通过向管道添加一个间隔来伪造输入。

我现在正在这样做:

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

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

但是我希望它在我的数组 'messages' 为空时停止间隔,有人可以帮我吗?我一直在尝试实施 .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 为空时 returns undefined 变为布尔值时 false 因此 takeWhile(Boolean) 将完成流。