我从服务器端收到一堆消息,我想通过在管道上添加一个间隔来伪造打字。
我现在正在这样做:
const stream = interval(1000)
.pipe(
map((): Message => {
return messages.pop();
})
);
this.feed = merge(
stream,
this.local
).pipe(
scan((acc, x) => [...acc, x], [])
);
但是我希望一旦数组“ messages”为空,它就会停止间隔,有人可以帮我吗?我一直在尝试实现.TakeWhile,但没有成功。
谢谢。
答案 0 :(得分:1)
take虽然效果很好,但您需要这样的东西:
const stream = interval(1000)
.pipe(
takeWhile(() => messages.length > 0),
map(() => messages.pop()),
);
我在stackblitz上做了一个小例子,希望您可以将其用于您的应用程序: https://stackblitz.com/edit/typescript-sq6wxb?file=index.ts
答案 1 :(得分:0)
因此,您的问题是,即使stream
为空,messages
仍会发光。
您可以使用takeWhile
完成流:
const stream = interval(1000).pipe(
map((): Message => messages.pop()),
takeWhile(Boolean),
);
当messages
为空时,它返回undefined
,当转换为布尔值时返回false
,因此takeWhile(Boolean)
将完成流。