作为RxJS的新手,我经常会创建一个在将来保存值的主题,但最初是undefined
。它第一次只能是undefined
。我目前使用filter
来跳过undefined
值,但这非常麻烦,因为我无处不在因为我只需要一次。 (也许我在这里做错了什么?)只有在通过mySubject
获得第一个值后才能以某种方式订阅onNext
吗?
var mySubject = new Rx.BehaviorSubject(undefined);
mySubject.filter(function(value) {
return value !== undefined;
}).subscribe(function(value) {
// do something with the value
});
答案 0 :(得分:36)
使用new Rx.ReplaySubject(1)
代替BehaviorSubject
。
答案 1 :(得分:10)
如Will所述,您应该可以使用skip运算符跳过第一个值:
var mySubject = new Rx.BehaviorSubject(undefined);
mySubject.skip(1).subscribe(function(value) {
// do something with the value
});
答案 2 :(得分:4)
mySubject.pipe( skipWhile( v => !v ) );
答案 3 :(得分:0)
目前我正在使用filter
operator,但我不知道这是否是一个很好的解决方案:
var mySubject = new Rx.BehaviorSubject().filter(x => !!x);
mySubject.subscribe(value => { /* will receive value from below */);
mySubject.next('value');
mySubject.subscribe(value => { /* also receives the value */ });
答案 4 :(得分:0)
有时会需要behaviourSubject,其中初始值无关紧要,而在流中进行操作时异步需要当前值, 就我们而言,在处理过程中或从流中任何地方获取数据时,都可以通过用户取消来处理多个链承诺。
这可以通过以下方式实现。
// for user related commands
this.commandSource = new BehaviorSubject(CONTINUE);
// filtering over initial value which is continue to make it as a different pipe
const stopPipe = commandSource.pipe(filter(val => val === STOP));
const fetchStream = Observable.fromPromise(this.fetchDetails);
merge(fetchStream, stopPipe).pipe(
take(1),
takeWhile(() => commandSource.value === CONTINUE),
concatMap((response) => {
// fetch Another response you can return promise directly in concatMap
// return array of response [1 ,2 ,3];
return this.fetchYetAnotherDetails;
}),
// we can add this to stop stream in multiple places while processing the response
takeWhile(() => commandSource.value === CONTINUE),
// triggers parallelly values from the concatMap that is 1, 2 , 3
mergeMap(() => // massage the response parallelly using )
finalize(() => thi
commandSource.complete())
).subscribe(res => {
// handle each response 1, 2, 3 mapped
}, () => {
// handle error
}, () => {
// handle complete of the stream
});
// when user, clicks cancel, this should stop the stream.
commandSource.next(STOP)
答案 5 :(得分:0)
我发现RxJS和RxSwift都令人沮丧。 (想要一个价值主体,并具有等待第一个价值的能力。)
对于JS,我目前仅收集主题的过滤版本,如下所示:
position: sticky
因此,主题仍然可以公开发布,但客户不必重复过滤器。
let mySubject = new Rx.BehaviorSubject();
mySubject.wait = mySubject.pipe(filter(v=>v!==undefined));