2016-11-22 8 views
2

私はループ内で作成されたobservablesの配列を持っています。そして、mergeを使用してこれらの観測値をすべてマージし、マージした観測値にサブスクライブしました。私はそれがどこで作成されたか(ループ内で)観測可能なコンテキストを取得する方法を見つけることができませんでした。 @martinは、この結合し、何の問題私が解決しようとしていますので、私は本当の問題を説明することを目的について尋ねられたので、ここではコードRxjsはobservableが作成された場所のコンテキストをバインドします

let observable = Rx.Observable.bindNodeCallback(request); 
let streams = _(['a', 'b', 'c', 'd']) 
.someMoreLodashStuff() 
.map(val => { 
    // HERE SOMEHOW I WANT TO BIND CONTEXT (e.g. loop val), 
    // SO THAT SUBSCRIBER CAN KNOW THE EXACT LOOP STATE 
    // WHEN RECEIVING RESULT 
    return observable(mutate(val)) 
}) 
.value(); 

Rx.Observable 
.merge(...streams) 
.subscribe(
    (res) => { 
    // HERE I WANT TO GET CONTEXT (e.g. val) 
    }, (err) => { 
    // HERE I WANT TO GET CONTEXT (e.g. val) 
    }, 
() => { 
    //on complete stuff 
    }); 

更新(@martinで尋ねたとして)

です。

Puposeと本当の問題

私はそのタイトルを取得し、HTMLでそれらをレンダリングして戻ってユーザーにHTMLを返し、(クエリのparamsとして渡された)ウェブサイトのリストをクロールしようとしています。これは私のopen source repoの一部で、node.jsのコールバック、async.jsの滝と約束を使ってこの正確な問題を解決しました。今rxjsを使ってそれを解決します。さまざまな非同期技術を学ぶための単なる方法です。これは、この問題

+0

最初のマップ()から 'this'を返すことができます。私はこれが何をすべきか、あなたが解決しようとしている問題を理解していません。なぜ、サブスクライブすると、map()演算子のどこかで使用されているコンテキストを知る必要がありますか? – martin

+0

@martinが質問を更新しました。実際の問題をよりよく理解することができたと思います。最初の 'map'から' this'を返すとObservablesが期待されるため、 'Rx.Observable.merge()'が失敗することがわかります。 – hhsadiq

+0

私はあなたがgithub(@martinsik)であなたにタグを付けました。私はそれがあなたの質問に対するより良い答えを与えるかもしれないことを願っています。 – hhsadiq

答えて

2

を解決するためにrxjsを使用して、あなたがマージされた入力+出力状態を含むタプルを作成するためにresultSelector機能を取るflatMapオーバーロードを使用することができ、入力状態への参照を保持する場合file from github repoです:

// given a function which can return the body of the page requested 
function doRequest(url) : Observable<string> 

const urls = Rx.Observable.from([a,b,c]) 
    .flatMap(
    a => doRequest(url), 
    (a,res) => ({ url: a, body: res}) 
) 
    .subscribe(resTuple => console.log(`url ${resTuple.url} returned ${resTuple.body}`) 
+0

素晴らしい答え、まさに私が探していたものです。ありがとうalot @マーク。 – hhsadiq

+0

ただ1つの質問だけ、resultSelectorは成功ハンドラ、エラーハンドラでどんな方法でも利用できます – hhsadiq

+0

doRequestからのエラーに対して 'catch'を使用できますか? –

関連する問題