用另一个可观察对象更改一个可观察对象的订阅状态

塞德

如果您运行下面的代码,你会在一个XHR请求,不管我是否是发送控制台中看到subscribedsubject当我不接受该请求时,我不想发出这些请求。

// npm install rxjs
const Rx = require('rxjs/Rx');

let subject = new Rx.BehaviorSubject(null)
Rx.Observable.timer(0, 1000).subscribe(i => someApiCall(i));
//at this point xhr request will be sent every second

function someApiCall(i){
    // retrieve some data
    console.log("xhr request sent")
    subject.next(i);
}

//so here we are gonna subscribe to the subject, xhr made prior 
//to this subscription are useless
let subscription;
setTimeout(() => subscription = subject.subscribe(i => console.log(i)),2500);
setTimeout(() => subscription.unsubscribe(),6000);
// now we are unsubscribing but the xhr req keep going

我使用behaviorSubject而不直接在可观察对象上进行订阅的原因是,当我重新订阅时,我希望即时获得最近一次xhr请求中的最后一个值。

阿什利

https://acutmore.jsbin.com/bepiho/2/edit?js,控制台

const { Observable } = Rx;

function someApiCall(i){
  return Observable.create(observer => {
    console.log("xhr request sent")
    observer.next(i);
    observer.complete();
  });
}

const data = Rx.Observable.timer(0, 1000)
  // map each value to the values of someApiCall
  . mergeMap(i => someApiCall(i))
  // share the values through a replaySubject
  .publishReplay(1)
  // Only connect to the source when there is at least one subscriber
  .refCount();

data
  .take(5)
  .subscribe(v => console.log(v));

data
  .take(1)
  .subscribe(v => console.log(v));

值得一提的是,如果每个人都.take(1)在订阅时这样做,这将无法按预期工作,因为每个人都将获得中的值ReplaySubject,然后在做出新的xhrRequest之前立即退订。

即,需要某种东西使其存活足够长的时间,以使发射间隔能够持续进行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

预订两个可观察对象,即在另一个可观察的HTTP内部观察

如何使RxJava 2中的可观察对象发出另一个可观察对象发出的组合项?

如何在另一个可观察对象内部解析一个可观察对象?-rxjs

无需CombineLatest即可从另一个可观察对象获得价值的最佳方法

RxJS:为另一个可观察对象设置默认值

如何使用一个可观察的状态跳过另一个可观察的值?

如何将一个可观察的KnockoutJs分配给另一个可观察的对象?

在Angular 4中使用另一个的响应调用另一个可观察的对象

创建一个可观察对象,该对象从另一个可观察对象发出数据子集

如何基于从另一个可观察对象返回的键中的键创建可观察/ http请求的数组

使用一个可观察对象同步另一个可观察对象

从另一个可观察对象调用可观察对象

如何将一个可观察对象映射到另一个

Angular-如何从另一个可观察对象返回一个可观察对象

用Typescript中的另一个可观察结果填充一个可观察的字段

如何用另一个可观察对象填充可观察对象并返回可观察对象

检索可观察的订户并使他们订阅另一个可观察的订户

RxJava:阻止某个可观察对象发出,直到发出另一个可观察对象的数据

将可观察到的嵌套对象映射到另一个对象

从另一个可观察对象的.subscribe函数返回一个可观察对象

使用RxJS如何触发另一个动作流的可观察对象

订阅另一个可观察对象内的嵌套可观察对象

使用角度rxjs中的另一个可观察对象转换数据

订阅另一个可观察的订阅者?

rxjava按条件收集对象并等待另一个可观察到的对象

将可观察的订阅嵌套在另一个可观察的订阅中是否可以接受

将一个可观察的嵌套对象映射到另一个对象

如何多次订阅一个可观察对象?

Rxjs:将数组字段中的每个元素从对象的可观察对象映射到另一个可观察对象