空数组时的停止间隔

时间:2019-03-04 22:14:04

标签: angular typescript kendo-ui rxjs conversational-ui

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

我现在正在这样做:

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 :(得分: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)将完成流。