【问题标题】:Rxjs: Poll data until predicate is metRxjs:轮询数据,直到满足谓词
【发布时间】:2016-09-17 18:44:08
【问题描述】:
import {Observable} from '@reactivex/rxjs'

// This is a fake API polling, this data is in reality coming from
// the server
const fakePoll$ = Observable.from([
  {
    status: 'initialized',
    data: {...},
  },
  {
    status: 'progress',
    data: {...},
  },
  {
    status: 'progress',
    data: {...},
  },
  {
    status: 'progress',
    data: {...},
  },
  {
    status: 'completed',
    data: {...},
  },
  ...
  {
    status: 'completed',
    data: {...},
  },
])

fakePoll$
  .takeWhile(x => x.status != 'completed')
  .subscribe(x => console.log(x))

这个sn-p返回所有的进度和初始化状态:

initialized
progress
progress
progress

但我需要完成第一个也像 takeWhile 但包容性。

【问题讨论】:

  • 我相信你在使用 api 时必须使用重复,假设它是一个承诺返回调用。我在 plnkr.co/edit/6fBPFCus3HhZmCFBXFKq 中这样做了。希望这会有所帮助。
  • 另外请参考我的问题,我在其中尝试了 3 种不同的方式。请随意发表评论。 stackoverflow.com/questions/44248530/…

标签: javascript rxjs rxjs5


【解决方案1】:

如果你只需要这样的话,你可以考虑把它加回来:

Rx.Observable.concat(fakePoll$
  .takeWhile(x => x != 'completed'), Rx.Observable.from('completed'))
  .subscribe(x => console.log(x))

【讨论】:

  • 我写的 sn-p 显然是一个显示我的问题的虚拟示例。在我的真实应用程序中,我 fakePoll 它是对 API 的轮询。
  • 好的,但这并没有改变这样一个事实,即如果您知道终端值是什么,您可以重新插入它。或者在您的用例中,您不知道结束轮询的值是什么?
  • 是的,假民意调查实际上是对充满其他我不知道的值的 api 的假民意调查。也许我必须编辑问题。
【解决方案2】:

我相信你在使用 api 时必须使用重复,假设它是一个承诺返回调用。我这样做了
Server Polling // 代码在这里

angular.module('rxApp', ['rx'])
  .controller('AppCtrl', function($scope, $http, rx) {
    function getRandom(){
       return Math.floor(Math.random() * (10 - 1)) + 1;
    }

    function getResults(){
       console.log("returning promise");
       return $http({
          url: "https://en.wikipedia.org/w/api.php?&callback=JSON_CALLBACK",
          method: "jsonp",
          params: {
            action: "opensearch",
            search: 'eclipse',
            format: "json"
          }
        });
    }
    var toBeRepeated =  rx.Observable
    .fromPromise(getResults).repeat()
    .map(response => { console.log(response); return response.data[1]; })
    .map(results => {
        var rs = results[getRandom()];
        console.log(rs);
        return rs;
    });             

    var source = toBeRepeated.takeWhile(rs => rs.indexOf('play') === -1);
        source.subscribe(function(item){
        console.log("item:"+ item);
    },err => { console.log(err); },completed => {console.log("completed :" + completed);} );
});

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2021-10-02
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多