2016-10-27 8 views
1

を要求必要..角度2/RXJSに - 私はrxjsドキュメントを読み続けるが、すべての演算子で迷子にいくつかの助けのバッチ処理が

これは私が私はこの必要なものを、これまで

let obs = Observable.from([1, 3, 5]) 

を得たものですその配列からいくらかの設定量はtake()です。それが成功したときに私はプロセスを再起動する必要があるときに、ポストの要求で結果を使用します。私はすべての結果を集め、プロセスが進むにつれて進捗状況を維持したい(進行状況バーの場合)

私はすべてのコードを必要としません。私が本当に知る必要があるのは、rxjsを使ってこの配列を分割する方法です。その一部を送信し、送信する必要がない限り、プロセスを再開します。

FINAL SOLUTION

var _this = this 

    function productsRequest(arr) { 
    return _this.chainableRequest('post', `reports/${clientId}/${retailerId}/`, loadedProductsReport, { 
     'identifiers': arr, 
     'realTime': true 
     })  
    } 

    let arrayCount = Math.ceil(identifiers.length/10) 
    let obs = Observable.from(identifiers)    
    .bufferCount(10) 
    .concatMap(arr => { 
     arrayCount-- 
     return arrayCount > 0 ? productsRequest(arr) : Observable.empty() 
    }) 


    let subscriber = obs.subscribe(
    value => console.log(value) 
) 

親でチェーン可能リクエストメソッド

chainableRequest(method: string, endpoint: string, action: Function, data = {}, callback?: Function){ 
let body = (<any>Object).assign({}, { 
    headers: this.headers 
}, data) 


return this._http[method.toLowerCase()](`${this.baseUri}/${endpoint}`, body, body) 
      .map((res: Response) => res.json()) 
    } 

答えて

2

これは主にあなたが達成しようとしているかに依存します。

Observableを以前のObservableに基づいて再帰的に呼び出すには、何回呼び出すかわからない場合は、expand()演算子を使用します。

たとえば、このデモは、再帰的に前の呼び出し(countプロパティ)からの応答に基づいて5つのリクエストを作成:コンソールに

import { Observable } from 'rxjs/Observable'; 

function mockPostRequest(count) { 
    return Observable.of(`{"count":${count},"data":"response"}`) 
     .map(val => JSON.parse(val)); 
} 

Observable.of({count: 0}) 
    .expand(response => { 
     console.log('Response:', response.count); 
     return response.count < 5 ? mockPostRequest(response.count + 1) : Observable.empty(); 
    }) 
    .subscribe(undefined, undefined, val => console.log('Completed')); 

プリント:http://plnkr.co/edit/lKNdR8oeOuB2mrnR3ahQ?p=preview

Response: 0 
Response: 1 
Response: 2 
Response: 3 
Response: 4 
Response: 5 
Completed 

をライブデモをご覧ください。

また、複数のHTTPリクエストを1つずつ順番に呼び出す場合(concatMap()オペレータ)、またはcすべてを一度にそれらのすべてと、彼らは(mergeMap()オペレータ)到着したものを消費:コンソールに

Observable.from([ 
    'https://httpbin.org/get?1', 
    'https://httpbin.org/get?2', 
    'https://httpbin.org/get?3', 
    ]) 
    .concatMap(url => Observable.of(url)) 
    .subscribe(response => console.log(response)); 

プリント:

https://httpbin.org/get?1 
https://httpbin.org/get?2 
https://httpbin.org/get?3 

がライブデモを参照してください:達成しようとして何イムhttp://plnkr.co/edit/JwZ3rtkiSNB1cwX5gCA5?p=preview

+0

は取るですx配列からの項目数 - >これをhttpリクエストに渡します。 HTTP要求が完了するまで待ってから、最初からアイテムを再度渡します。私はあなたのすべての例を試しましたが、何をしようとしているのかを理解する方法は見ていません。 – hamobi

+0

@hamobi Observablesを実行するには、 'concatMap()'を実行してください。次に、同じ配列か何かからプロセスを再起動しますか? – martin

+0

はい同じアレイからプロセスを再開します。私は配列の最後に到達するまで、配列から10個のアイテムを送信し、次に10個のアイテムを送信するなどします。ありがとう:) – hamobi

関連する問題