私はRxを初めて使い、Httpでトークン管理の作業をしています。私はトークンを追跡し、このトークンがすべてのアウトバウンドHTTPリクエストのヘッダーに追加されるという考えがあります。RxJs - 購読対象の件名から次の件を呼ぶ
コードはそうのようになります。観測可能な要求から返される
const request = (name, token, time) => {
console.log('attempt ' + name + ' with token ' + token);
return Rx.Observable.timer(time)
.do(() => {
console.log('sent ' + name + ' with token ' + token);
})
.mapTo({ newToken: 'baz' }) // token baz arrives
.do(r => {
console.log('response for ' + name + ' received');
});
};
const token$ = new Rx.ReplaySubject(1);
token$.switchMap(token => request('request1', token, 0))
//.do(rs => { token$.next(rs.newToken); }) // fails, causes a loop
.subscribe(
// (rs) => { token$.next(rs.newToken); } // also fails with loop
);
token$.switchMap(token => request('request2', token, 1000))
.subscribe();
// emit a token
token$.next('bar');
// but how do I ensure 'request2' is sent with token 'baz' ?
私の質問は、どのように私はbaz
とReplaySubject
を更新することができますか?
私はそうのようrequest1
でdo
からnext
を呼び出してみました:
token.switchMap(token => request('request1', token, 0))
.do(rs => { token.next(rs.newToken); })
.subscribe();
しかし、これはループにそれを送り、request1
がトークンbaz
で繰り返されます。件名のnext
をdo
から購読されたObservableでこのように呼び出すことはできますか?私はそれがいくつかのRx契約や何かに違反しているのだろうかと思っています。
私はまた、このようrequest1
を試してみました:
token.switchMap(token => request('request1', token, 0))
.subscribe(rs => { token.next(rs.newToken); });
しかし、同じループが発生します。おそらく私はnext
を私がswitchMap
である事に呼んでいるからでしょうか?
どのように私はこれを動作させることができますか?ありがとう!その後、再利用されるべきである、私はあなたが右のこのmap
関数は、実際にいくつかの外部コールを行うと、トークンを返すことになっている理解していれば
あなたは明確にしてくださいすることはできます(また、私たちは
switch
の有益な行動を失うことになる。RxJsにはswitchScan
はありません)。トークンはサーバーによって割り当てられていますか?そうであれば、なぜそれを「foo」に変更してから「bar」に変更しますか?新しいトークンを手に入れたらすぐに行動しますか? – Meirトークンはサーバーによって返されます。はい。私はテストのために上記の 'foo'と' bar'トークンを追加しました。考え方は、request1はトークン 'bar'(これはそうです)を持っていて、request2はサーバによって返されたトークン' baz'を持っていなければなりません(現在はありません)。私は 'do'関数で' next(rs.newToken) 'を呼び出し、 'subscribe'コールバックでもこれを試みていました。あなたがjsbinを見ると、それがどうして失敗するか見ることができます。 – ghostypants
コードを少しきれいにして 'foo'ナンセンスを削除しました。お返事をありがとうございます! – ghostypants