2016-09-17 70 views
1
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)) 

這段代碼返回所有的進步和初始化狀態:Rxjs:民意調查數據,直到謂詞滿足

initialized 
progress 
progress 
progress 

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

+0

我相信你必須在使用API​​時重複使用,假設它是一個回覆的承諾。我在plnkr.co/edit/6fBPFCus3HhZmCFBXFKq這樣做過。希望這可以幫助。 –

+0

也請參考我的問題,我以3種不同的方式嘗試了這一點。請隨意發表評論。 https://stackoverflow.com/questions/44248530/server-polling-using-rxjs-till-condition-is-met –

回答

1

你可以考慮將其添加回喜歡這裏,如果這就是你需要:

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

我寫的代碼段顯然是一個虛擬的例子來顯示我的問題。在我的真實應用程序中,我僞造一個API輪詢。 – cl0udw4lk3r

+0

好的,但它並沒有改變這個事實,如果你知道什麼是終端值,你可以重新插入它。或者在你的用例中,你不知道結束投票的價值是什麼? – user3743222

+0

是的,假民意調查實際上是一個虛假的民意調查,充滿了我不知道的其他價值觀。也許我必須編輯這個問題。 – cl0udw4lk3r

0

我相信你有使用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);}); 
}); 

希望這有助於。