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.jsrx.all.jsrx.all.compat.jsrx.compat.jsrx.lite.jsrx.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.jsrx.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.jsrx.all.compat.jsrx.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!
待定