我是Rx的新手,并且使用Http处理一些令牌管理工作。我的想法是,我跟踪一个令牌,并将此令牌附加到所有出站http请求的标头。RxJs - 从订阅Observable调用下一个主题
代码看起来像这样:
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' ?
我的问题是,我怎么可以更新ReplaySubject
与baz
从请求返回观察到的?
我打过电话next
从do
在request1
像这样:
token.switchMap(token => request('request1', token, 0))
.do(rs => { token.next(rs.newToken); })
.subscribe();
但这将它变成一个循环和request1
重复使用令牌baz
。在订阅的Observable中是否可以在do
这样的主题上调用next
?我想知道它是否违反了某些Rx合同或其他内容。
我自己也尝试request1
这样的:
token.switchMap(token => request('request1', token, 0))
.subscribe(rs => { token.next(rs.newToken); });
但是,同样的循环发生。可能是因为我打电话给next
我是switchMap
-ing!
任何想法如何能解决这个问题?谢谢!
能否请你澄清。令牌是否由您的服务器分配?如果是这样,你为什么将它改为'foo'然后改为'bar'?你是否立即采取行动来获取新的令牌? – Meir
令牌由服务器发回,是的。我刚刚添加了上面的'foo'和'bar'标记来测试。这个想法是,request1应该有令牌'bar'(它会这样做),并且request2应该有服务器返回的令牌'baz'(它目前没有)。我试图通过调用'do'函数中的'next(rs.newToken)'以及'subscribe'回调函数来做到这一点。如果你看看jsbin,你可以看到失败的原因。 – ghostypants
清理了一下代码并删除了'foo'废话。感谢您的回复! – ghostypants