2016-10-11 7 views
1

こんにちは、前任者の結果に応じて、それぞれ一連のajaxリクエストを行いたいと思います。rxjsを使ってasync reduceまたはflatReduceを行う方法

var urls = ["http://example.org/foo","http://example.org/bar", "..." ] 

Rx.Observable 
.from(urls) 
.reduce((response, url, idx, source)=>{ 

    return Rx.DOM.ajax({ 
    url: url+'?param='+ response.yxz, //append some results to the next request 
    responseType: 'json' 
    }).map(data=>data.response) 

},{yxz:0}) 
    .subscribe(... 

でも減らすためのアキュムレータは、「真の」値が返されることを想定しています

私の考えでは、このようなURLのリストを削減することでした。

このような方法はありますか?flatReduce電話をかけますか?

答えて

0

すべての結果を累積したくないため、減らす必要はありません。

あなたはここに再帰的に考える必要があります。

function tail(list) { 
    return list.splice(-1, 1) 
} 


function request(urls, param) { 
    if (urls.length <= 0) return param; 
    return Rx.DOM.ajax({ 
    url: urls[0] + '?param=' + param, 
    responseType: 'json' 
    }) 
    .map(data => data.response.xyz) 
    .flatMap(response => request(tail(urls), response)); 
} 


request(["http://example.org/foo", "http://example.org/bar", "..."], 0) 
    .subscribe(...) 
+0

こんにちはmyhauを、私はこれは動作しますが、私は一種のオペレータとrxjs関数型言語を残すだろうと思い必ず、ご提案していただきありがとうございます。多分カスタムオペレーターとしてこれをしようとする可能性があります – maxb

0

私はこれに新たなんだとまったく同じことを思っていました。私が思いついた解決策ではなくArray.reduceメソッドを使用していた:

var urls = ["http://example.org/foo","http://example.org/bar", "..." ] 

urls.reduce((observable, url) => { 

    return observable.flatMap(
     (response) => { 

      return Rx.DOM.ajax({ 
       url: url+'?param='+ response.yxz, //append some results to the next request 
       responseType: 'json' 
      }) 
      .map(data=>data.response); 
     } 

}, Observable.of({yxz:0})) 
.subscribe(... 
関連する問題