2017-06-02 17 views
-1

少し疑似コードを下に通過せずにサブスクライブします。 これまでのところ、私はobservableを拡張しようとしましたが、私が行った場合、observable内の演算子をオーバーライドする必要があるように見えます。RxJsは、内部のタイトルを説明するために

ほとんどの場合、イベントにメタデータを提供したいと考えています。

これは外部的に使用するライブラリなのでmyObjectを渡したくないので、私は自分のコードベース内のobservablesを購読しますが、observableを連鎖することは外部で行われます。

誰でもこれを達成するためのアイデアはありますか?ただ必要な、すでに書き込まれている

const server$ = RxHttpServer(server) 

const api$ = server.filter((request) => request.url.startsWith('/api')); 

const apiEndpoint$ = api.map(() => ({ 
    status: 400, 
    body: 'this is an api endpoint', 
    headers: { 
    } 
})); 

// Inside my library, note the use of the response object that I don't have access to: 
apiEndpoint.subscribe((dataToSend) => response.write(dataToSend)) 

内部ロジックと、これらのオブジェクトの取り扱い:コンテキストについては

、 は、私は私が次の操作を行うことができます純粋にRxJs HTTPライブラリを作成しようとしていますその応答オブジェクトに返信します。

+0

私のRxJSに関する知識は限られていますが、myObjectをパラメータとして渡す必要はありませんか? 'source.next(newNumber、myObject)'もしあなたが何らかの引数の分解を行うことができなかったら 'source.next({newNumber、myObject})'。 – Baruch

+0

@Baruch、これは私がこの記事で避けようとしていることの一つです。フレームワークのユーザが、自分が作ったチェーンごとにレスポンスを渡す必要はないからです。フラット・マップで別のエンドポイントを呼び出すエンドポイントを想像するとすぐにレスポンスが失われたり、セレクタ関数をどこからでも使用しなければならない場合は、使いやすさが少し損なわれてしまいます。 –

+0

'response'オブジェクトをラップすることを検討しますかあなたは観察できる必要がありますか?その場合、 'apiEndpoint $'と 'response $'の両方を 'combineLatest'してコールバックの2つにアクセスすることができます。 – atomrc

答えて

0

responseForヘルパーを使用してレスポンスメタデータを取得し、各HTTPリクエストごとに1つずつレスポンスSubjectの観測可能なものを返すことができます。ライブラリユーザーは、それをサブスクライブし、各応答サブジェクトにデータを書き込むことができます。図書館では、あなたが同じ応答のサブジェクトに登録して、完了したらそれをクライアントに送り返すことができます。何かが好きです:

// even better extending the Observable prototype 
// const apiEndpoint$ = api$.mapResponseFor(... 
const apiEndpoint$ = api$.map(responseFor({ 
    status: 400, 
    body: 'this is an api endpoint', 
    headers: {} 
})); 

apiEndpoint$.subscribe(response => { 
    response.next(data) 
    response.complete() 
}) 
+0

私はあなたが正しく意味するものを理解していないかもしれませんが、タイプ応答のSubjectは実際には機能しません。応答するのに2秒かかるリクエストと瞬時に処理できるリクエストがある場合、最初のリクエスト)は、第2の観測値によって処理される。 もう一度、私はこれを完全に間違っていると思いますが、responseForメソッドは何をしますか? :) –

+0

'apiEndpoint $'オブザーバが何をするかによって異なります。遅い場合は、他の非同期呼び出しを行い、それ以降の応答を完了することを意味します。非同期呼び出しがスケジュールされ、javascriptが最初のオブザーバーのコードからすぐに戻り、次のオブザーバーが提供されます。 slowが実際の計算を意味する場合、最初のオブザーバはブロックし、2番目のオブザーバは処理されません。しかし、それは常にシングルスレッドされているJavaScriptの問題です。並行処理を行うプラットフォーム固有の方法が必要です。つまり、処理コードをWebワーカーにラップすることができます。 –

+0

もう1つのことは、各応答の件名で 'responseSubject.observeOn(Rx.scheduler.async)'を呼び出すことです。これにより、ユーザーが 'response.next(data)'を実行したときに同期的に実行されることがなくなり、他のオブザーバーに処理時間が与えられるようになります。しかし、 'data'を計算する計算が同期的で長く(コード内でスリープしているように)長い場合、それはまだメインのJavaScriptスレッドをブロックしています。 –

関連する問題