[英]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))
此代码段返回所有进度和初始化状态:
initialized
progress
progress
progress
但我需要完成第一个也像 takeWhile 但包容。
如果您只需要这样,您可以考虑将其添加回此处:
Rx.Observable.concat(fakePoll$
.takeWhile(x => x != 'completed'), Rx.Observable.from('completed'))
.subscribe(x => console.log(x))
我相信您在使用 api 时必须使用重复,假设它是一个承诺返回调用。 我这样做了
服务器轮询// 代码放在这里
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);} );
});
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.