【问题标题】:Filter Observable by Observable按 Observable 过滤 Observable
【发布时间】:2015-08-27 10:02:39
【问题描述】:

我想确保 Observable.subscribe() 在不同的 Observable 产生 true 时不会被执行。

一个示例用例是确保用户只有在前一个下载完成(或失败)并且一次只执行一个下载请求时才能触发下载。

为了控制执行流程,我不得不依赖一个状态变量,这对我来说有点奇怪——这是一个好的模式吗?在一个可能的情况下,它不是 - 什么是更好的方法?

我最终得到了两个订阅:Actions.sync(使用主题、公共 API,初始化同步请求)和 isActive(解析为 true 或 `false,名称应该是不言自明的。

let canDownload = true; // this one feels really, really naughty
const startedSyncRequests = new Rx.Subject();
const isActiveSync = startedSyncRequests.map(true)
  .merge(completeSyncRequests.map(false))
  .merge(failedSyncRequests.map(false))
  .startWith(false)
  .subscribe(isActive => canDownload = !isActive)

syncResources = ()=>{
  startedSyncRequests.onNext();
  // Mocked async job
  setTimeout(()=> {
    completeSyncRequests.onNext();
  }, 1000);
};


Actions.sync
  .filter( ()=> canDownload ) // so does this
  .subscribe( syncResources );

【问题讨论】:

  • 是否要对中间下载请求进行排队?

标签: javascript frp rxjs


【解决方案1】:

你想要exclusive()

Actions.sync
  .map(() => {
    //Return a promise or observable
    return Rx.Observable.defer(() => makeAsyncRequest());
  })
  .exclusive()
  .subscribe(processResults);

每次用户发出请求时,上面都会生成一个 observable。但是,exclusive 将丢弃在前一个完成之前进入的所有可观察对象,然后将生成的消息扁平化为单个可观察对象。

工作示例(使用intervaldelay):

var interval = Rx.Observable.interval(1000).take(20);


interval
  .map(function(i) {
    return Rx.Observable.return(i).delay(1500);
  })
  .exclusive()
  //Only prints every other item because of the overlap
  .subscribe(function(i) {
    var item = $('<li>' + i + '</li>');
    $('#thelist').append(item);
  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/2.5.3/rx.all.js"></script>
<div>
  <ul id="thelist">
  </ul>

</div>

参考:here

【讨论】:

  • 如果要对中间下载请求进行排队,如何处理?
  • @SamarPanda 使用concatAll() 而不是exclusive()
猜你喜欢
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 2018-05-22
  • 2018-05-25
  • 2023-04-03
  • 2020-05-22
  • 1970-01-01
  • 2019-01-23
相关资源
最近更新 更多