【问题标题】:switchMapTo upon source observable emissionswitchMapTo 在源可观察发射时
【发布时间】:2017-12-25 16:16:33
【问题描述】:

switchMapswitchMapTo 之间的区别在于 switchMap 在发射时将每个源发射转换为可观察的,而switchMapTo 忽略发射值并将每个发射转换为在 stream 期间建立的 Observable创作

这里的经验法则是当你的内部流依赖于源流值时使用switchMap,而不是使用switchMapTo

但是如果我不关心发射值但我关心发射时间怎么办?
这意味着我希望在源 Observable 发射时对内部 Observable 进行评估。

这里很明显是使用switchMap(() => Observable),但感觉不对,因为我之前提到的拇指规则。


switchMapTo 为例(不好):

const predefinedKey = 'key';

//This need to be initialized
const obj = {};

function getObservable(key){
  return Rx.Observable.of(obj[key]);
}

//This is initialization stream
const initialize = new Rx.ReplaySubject();
initialize.next(1);

const onInit = initialize.do(val => obj[predefinedKey] = val);

//Would like to access the object only after initialization
const result = onInit.switchMapTo(getObservable(predefinedKey));
//Expect to see 1 in output but see 'undefined' because switchMapTo evaluated before the object is initialized
result.subscribe(val => console.log(val));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.min.js"></script>

switchMap 为例():

const predefinedKey = 'key';

//This need to be initialized
const obj = {};

function getObservable(key){
  return Rx.Observable.of(obj[key]);
}

//This is initialization stream
const initialize = new Rx.ReplaySubject();
initialize.next(1);

const onInit = initialize.do(val => obj[predefinedKey] = val);

//Would like to access the object only after initialization
const result = onInit.switchMap(() => getObservable(predefinedKey));
//Expect to see 1 in output
result.subscribe(val => console.log(val));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.min.js"></script>

这些示例非常人为,但它们很好地描述了情况。

这里的正确方法是什么?我可以使用任何其他 Observable 函数来延迟执行吗?

【问题讨论】:

  • 我看不出这不是正确的事情的原因。我也经常在 mergeMapmap 运算符周围有非常相似的模式,这表明它仅取决于源排放,但会丢弃这些值,然后完全映射到另一个值。
  • »但是如果我不关心发射值但我关心发射时间怎么办?«你能举个例子吗?
  • 提供的例子

标签: rxjs rxjs5


【解决方案1】:

根据您的示例,您可以将switchMapToObservable.defer 结合使用:

const predefinedKey = 'key';
const obj = {};

function getObservable(key){
  return Rx.Observable.defer(() => Rx.Observable.of(obj[key]));
}

const initialize = new Rx.ReplaySubject();
initialize.next(1);

const onInit = initialize.do(val => obj[predefinedKey] = val);

const result = onInit.switchMapTo(getObservable(predefinedKey));
result.subscribe(val => console.log(val));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.min.js"></script>

除了在getObservable 中推迟,您还可以在switchMapTo 调用中推迟:

const result = onInit.switchMapTo(Rx.Observable.defer(() => getObservable(predefinedKey)));

这将取决于具体情况。也就是说,我也不认为使用switchMap 有什么问题,而且就个人而言,我可能会这样做而不是推迟(这在其他情况下很有用)。

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多