Defer 运算符会等到观察者订阅它,然后它才会生成一个 Observable,通常使用 Observable 工厂函数。它对每个订阅者都会重新执行此操作,因此虽然每个订阅者都认为它正在订阅同一个 Observable,但实际上每个订阅者都获得了自己独立的序列。
在某些情况下,等到最后一刻(即直到订阅时间)才生成 Observable 可以确保这个 Observable 包含最新数据。
待定
待定
RxGroovy 将此运算符实现为 defer
。此运算符将您选择的 Observable 工厂函数作为其唯一参数。此函数不接受任何参数,并返回一个 Observable。
defer
默认情况下不会在特定 Scheduler 上运行。
defer()
可选的 rxjava-computation-expressions
包中有一个类似的运算符(它不是标准 RxGroovy 运算符集的一部分)。switchCase
运算符根据条件创建并返回一组可能的 Observable 中的一个。
可选的 rxjava-computation-expressions
包中还有一个更简单的运算符(它也不是标准 RxGroovy 运算符集的一部分),即 ifThen
。此运算符检查一个条件,然后根据结果镜像源 Observable 或空 Observable。
RxJava 将此运算符实现为 defer
。此运算符将您选择的 Observable 工厂函数作为其唯一参数。此函数不接受任何参数,并返回一个 Observable。
defer
默认情况下不会在特定 Scheduler 上运行。
defer()
可选的 rxjava-computation-expressions
包中有一个类似的运算符(它不是标准 RxJava 运算符集的一部分)。switchCase
运算符根据条件创建并返回一组可能的 Observable 中的一个。
可选的 rxjava-computation-expressions
包中还有一个更简单的运算符(它也不是标准 RxGroovy 运算符集的一部分),即 ifThen
。此运算符检查一个条件,然后根据结果镜像源 Observable 或空 Observable。
RxJS 将此运算符实现为 defer
。此运算符将您选择的 Observable 工厂函数作为其唯一参数。此函数不接受任何参数,并返回一个 Observable 或一个 Promise。
/* Using an observable sequence */ var source = Rx.Observable.defer(function () { return Rx.Observable.return(42); }); var subscription = source.subscribe( function (x) { console.log('Next: ' + x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); } );
Next: 42 Completed
var source = Rx.Observable.defer(function () { return RSVP.Promise.resolve(42); }); var subscription = source.subscribe( function (x) { console.log('Next: ' + x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); } );
Next: 42 Completed
defer
存在于以下发行版中
rx.js
rx.all.js
rx.all.compat.js
rx.compat.js
rx.lite.js
rx.lite.compat.js
RxJS 还实现了 if
运算符。它接受一个返回布尔值的函数、一个如果该函数返回真值则要镜像的 Observable,以及可选的第二个 Observable,如果该函数返回假值则要镜像它(如果省略此参数,if
会在这种情况下镜像空 Observable)。
var shouldRun = false; var source = Rx.Observable.if( function () { return shouldRun; }, Rx.Observable.return(42), Rx.Observable.return(56) ); var subscription = source.subscribe( function (x) { console.log('Next: ' + x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); });
Next: 56 Completed
if
存在于以下发行版中
rx.all.js
rx.experimental.js
(需要 rx.js
、rx.compat.js
、rx.lite.js
或 rx.lite.compat.js
)RxJS 实现了一个类似的运算符,称为 case
(或“switchCase
”)。此运算符根据条件创建并返回一组可能的 Observable 中的一个。它接受以下参数
var sources = { 'foo': Rx.Observable.return(42), 'bar': Rx.Observable.return(56) }; var defaultSource = Rx.Observable.empty(); var source = Rx.Observable.case( function () { return 'foo'; }, sources, defaultSource); var subscription = source.subscribe( function (x) { console.log('Next: ' + x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); } );
Next: 42 Completed
case
/switchCase
存在于以下发行版中
rx.all.js
rx.all.compat.js
rx.experimental.js
(需要 rx.js
、rx.compat.js
、rx.lite.js
或 rx.lite.compat.js
)待定
RxPHP 将此运算符实现为 defer
。
返回一个可观察序列,该序列在每个新的观察者订阅时调用指定的工厂函数。
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/defer/defer.php $source = \Rx\Observable::defer(function () { return \Rx\Observable::of(42); }); $subscription = $source->subscribe($stdoutObserver);
Next value: 42 Complete!
待定