0

我从服务器端收到一堆消息,我想通过在管道中添加一个间隔来伪造打字。

我现在正在这样做:

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

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

但是,一旦我的数组“消息”为空,我希望它停止间隔,有人可以帮我吗?我一直在尝试实施 .TakeWhile,但没有成功。

提前致谢。

4

2 回答 2

1

takeWhile 工作正常,你需要这样的东西:

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

我在 stackblitz 上做了一个小例子,我希望你能把它应用到你的应用程序中: https ://stackblitz.com/edit/typescript-sq6wxb?file=index.ts

于 2019-03-04T22:32:09.947 回答
0

所以你的问题是,stream即使messages是空的,它也会继续发射。

您可以使用takeWhile来完成流:

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

messages为空时它返回undefinedfalse当它变成布尔值时,takeWhile(Boolean)它将完成流。

于 2019-03-04T22:32:15.827 回答