Delay 操作符通过在发出可观察对象中的每个项目之前暂停特定时间增量(由您指定)来修改其源可观察对象。这会将可观察对象发出的整个项目序列的时间向前推移指定的增量。
delay
delayWithSelector
待定
delay delaySubscription
RxGroovy 将此操作符实现为 delay 和 delaySubscription 的变体。
delaySubscription
delay 的第一个变体接受定义时间长度的参数(时间量和表示此量的 TimeUnit)。每次源可观察对象发出项目时,delay 都会启动一个计时器,当该计时器达到给定的持续时间时,从 delay 返回的可观察对象会发出相同的项目。
TimeUnit
请注意,delay 不会以这种方式将 onError 通知进行时间推移,但会立即将其转发给其订阅者,同时丢弃任何待处理的 onNext 通知。但是,它会将 onCompleted 通知进行时间推移。
onError
onNext
onCompleted
默认情况下,此 delay 变体在 computation Scheduler 上运行,但您可以通过将其作为 delay 的可选第三个参数传递来选择不同的调度器。
computation
delay(long,TimeUnit)
delay()
delay 的另一个变体不使用恒定的延迟持续时间,而是通过将源可观察对象中的每个项目传递给返回可观察对象的函数,然后监视这些可观察对象来设置每个项目的延迟持续时间。当任何此类可观察对象发出项目或完成时,由 delay 返回的可观察对象会发出关联的项目。
此 delay 变体默认情况下不在任何特定 Scheduler 上运行。
delay(Func1)
使用每个项目可观察对象来设置延迟的 delay 变体有一个变体,它允许您传递一个函数,该函数返回一个可观察对象,该可观察对象充当对源可观察对象的订阅的延迟计时器(如果没有,delay 会在观察者订阅由 delay 返回的可观察对象时立即订阅源可观察对象)。
delay(Func0,Func1)
还有一个操作符,您可以使用它来延迟对源可观察对象的订阅:delaySubscription。它接受定义延迟时间的参数(时间量和表示此量的 TimeUnit)。
此 delay 变体默认情况下在 computation Scheduler 上运行,但您可以通过将其作为 delaySubscription 的可选第三个参数传递来选择不同的调度器。
delaySubscription(long,TimeUnit)
delaySubscription(long,TimeUnit,Scheduler)
还有一个 delaySubscription 变体,它使用可观察对象(由您提供的函数返回)而不是固定持续时间来设置订阅延迟。
此 delaySubscription 变体默认情况下不在任何特定 Scheduler 上运行。
delaySubscription(Func0)
RxJava 将此操作符实现为 delay 和 delaySubscription 的变体。
delay delaySubscription delayWithSelector
在 RxJS 中,您可以通过两种方式设置每个项目的延迟:将毫秒数传递给 delay 操作符(这会将每个发出时间延迟该时间量),或者传递一个 Date 对象(这会将发出时间序列的开始延迟到该绝对时间点)。
Date
此操作符默认情况下在 timeout Scheduler 上运行,但您可以通过传递另一个调度器作为可选的第二个参数来覆盖此操作。
timeout
var source = Rx.Observable.range(0, 3) .delay(new Date(Date.now() + 1000)); var subscription = source.subscribe( function (x) { console.log('Next: ' + x.toString()); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); });
Next: 0 Next: 1 Next: 2 Completed
var source = Rx.Observable.range(0, 3) .delay(1000); var subscription = source.subscribe( function (x) { console.log('Next: ' + x.toString()); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); });
delaySubscription 与 delay 相似,但它不是对源可观察对象的发出时间进行时间推移,而是对订阅该可观察对象的时刻进行时间推移。您将时间值传递给此操作符(一个 Number,在这种情况下,它会设置毫秒延迟,或者一个 Date,在这种情况下,它会设置 delaySubscription 将触发订阅的绝对未来时间)。您可以选择将 Scheduler 作为第二个参数传递,delaySubscription 将使用它来控制延迟时间段或触发时间。
Number
var start = Date.now(); var source = Rx.Observable.range(0, 3).delaySubscription(5000); var subscription = source.subscribe( function (x) { console.log('Next: %s, %s', x, Date.now() - start); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); });
Next: 0, 5001 Next: 1, 5002 Next: 2, 5003 Completed
delayWithSelector 与 delay 相似,但它不使用恒定的延迟持续时间(或绝对时间),而是通过将源可观察对象中的每个项目传递给返回可观察对象的函数,然后监视这些可观察对象来设置每个项目的延迟持续时间。当任何此类可观察对象完成时,由 delay 返回的可观察对象会发出关联的项目。
var source = Rx.Observable .range(0, 3) .delayWithSelector( function (x) { return Rx.Observable.timer(x * 400); }) .timeInterval() .map(function (x) { return x.value + ':' + x.interval; }); var subscription = source.subscribe( function (x) { console.log('Next: ' + x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); });
Next: 0:0 Next: 1:400 Next: 2:400 Completed
delayWithSelector 还有一个版本,它接受一个额外的(第一个)参数:一个可观察对象,它会在 delayWithSelector 在它自己被订阅后订阅源可观察对象之前设置延迟。
var source = Rx.Observable .range(0, 3) .delayWithSelector( Rx.Observable.timer(300), function (x) { return Rx.Observable.timer(x * 400); } ) .timeInterval() .map(function (x) { return x.value + ':' + x.interval; }); var subscription = source.subscribe( function (x) { console.log('Next: ' + x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); });
Next: 0:300 Next: 1:400 Next: 2:400 Completed
delay、delaySubscription 和 delayWithSelector 需要 rx.lite.js 或 rx.lite.compat.js,并且在以下每个发行版中都可以找到
rx.lite.js
rx.lite.compat.js
rx.all.js
rx.all.compat.js
rx.time.js
rx.js
rx.compat.js
Delay DelaySubscription
RxPHP 将此操作符实现为 delay。
将可观察对象序列的时间推移 dueTime。值之间的相对时间间隔保持不变。
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/delay/delay.php \Rx\Observable::interval(1000) ->doOnNext(function ($x) { echo 'Side effect: ' . $x . "\n"; }) ->delay(500) ->take(5) ->subscribe($createStdoutObserver());
Side effect: 0 Next value: 0 Side effect: 1 Next value: 1 Side effect: 2 Next value: 2 Side effect: 3 Next value: 3 Side effect: 4 Next value: 4 Complete!
delay delay_subscription delay_with_selector