顾名思义,将推迟在指定时间内发出的值。有两种方法可以做到这一点。一种是存储值,直到您准备好发射它们为止。另一种是将订阅延迟。
最简单的Delay实现会使每个值延迟相同的时间。您可以将其视为延迟序列的开始,同时保持连续元素之间的时间间隔。
日志输出:
我们创建了间隔100毫秒的5个值,然后我们将序列延迟了1秒。我们可以看到第一个值需要〜(1000 + 100)ms,下一个值每个需要100ms。
您还可以单独延迟每个值。
此重载采用一个函数,该函数将为每个项创建一个observable。当该observable发出onNext时,相应的项目将以延迟的顺序发出。这是一些代码:
日志输出:
初始序列间隔100ms,结果确为200ms。如果你还记得,间隔会发出数字i = 1,2,3等。我们将每个项目延迟i * 100,因此第一项延迟100ms,然后第二项延迟200ms,第三项延迟300ms。连续延迟之间的差异是100ms。添加到初始100毫秒间隔,导致项目间隔200毫秒。
delaySubscription
您可以完全延迟订阅,而不是存储值并在以后发布它们。根据观察结果是热还是冷,这将产生不同的效果。这将在热和冷的observables章节中进行更多讨论。对于我们到目前为止的示例,可观察量是冷的,订阅事件是在创建源可观察量时(即序列的开始)。这意味着在将每个项目延迟相同数量并延迟订阅之间的顺序没有区别。由于这是这种情况,延迟订阅更有效,因为操作员不需要在内部缓冲项目。
日志输出:
我们在这里看到的是间隔可观察(即其创建)的订阅被延迟了1000ms。之后,序列按照定义进行。
您还可以通过以下重载基于信号可观察来延迟订阅:
该参数是一个函数,它将为每个订阅创建一个新的observable。订阅被延迟,直到相应的observable发出一个值。以下示例等同于我们刚刚看到的示例。
日志输出:
delay values and subscription
此类别中的最后一种方法允许您单独延迟订阅和每个项目。
这结合了我们已经看到的两种延迟变体。第一个参数是一个函数,它创建一个observable,用于指示何时执行订阅。第二个参数采用每个项目并决定应该延迟多长时间。
原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%203%20-%20Taming%20the%20sequence/5.%20Time-shifted%20sequences.md
下节继续!
有什么讨论的内容,可以加我公众号: