简体   繁体   English

Rxjs:轮询数据直到满足谓词

[英]Rxjs: Poll data until predicate is met

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))

This snippet returns all the progress and initialized statuses:此代码段返回所有进度和初始化状态:

initialized
progress
progress
progress

But I need to get the first completed also like a takeWhile but inclusive.但我需要完成第一个也像 takeWhile 但包容。

You could consider adding it back like here, if that is all you need :如果您只需要这样,您可以考虑将其添加回此处:

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

I believe you have to use repeat when using an api assuming it is a promise returning call.我相信您在使用 api 时必须使用重复,假设它是一个承诺返回调用。 I did this as in我这样做了
Server Polling // Code goes here服务器轮询// 代码放在这里

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);} );
});

Hope this helps.希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM