rxjs:forkJoin是否至少需要一次对next的调用才能完成?
我想加入两个观测值:rxjs:forkJoin是否至少需要一次对next的调用才能完成?,rxjs,rxjs5,Rxjs,Rxjs5,我想加入两个观测值: var goodObservable = Rx.Observable.create( function(observer){ observer.next('something'); observer.complete(); }); var badObservable = Rx.Observable.create( function(observer){ observer.complete(); }); var forkJoi
var goodObservable = Rx.Observable.create( function(observer){
observer.next('something');
observer.complete();
});
var badObservable = Rx.Observable.create( function(observer){
observer.complete();
});
var forkJoinedObservable = Rx.Observable.forkJoin([goodObservable, badObservable]);
forkJoinedObservable.subscribe(function(results){
console.log(results);
});
其中一个可观察到的只调用complete。现在我发现,分叉连接的观测值永远不会被触发。我必须调用badObservable中的observer.next(),以便执行forkJoin上的订阅
我预期的行为是,forkJoin订阅将使用只包含一个项的数组执行:['something']
这是一个bug,还是我没有正确理解这个概念
我已经为此做了一个提示:forkJoin()
从每个可观察对象发出最后发出的项。在这种情况下没有要发射的项,因此操作符不发射
一个实用的解决方案是对每个可观察对象调用.startsWith(defaultValue)
,这样forkJoin()
也可以完成
var goodObservable = Rx.Observable.create( function(observer){
observer.next('something');
observer.complete();
});
var badObservable = Rx.Observable.create( function(observer){
observer.complete();
}).startWith(null);
var forkJoinedObservable = Rx.Observable.forkJoin([goodObservable, badObservable]);
forkJoinedObservable.subscribe(function(results){
console.log(results);
});
关于仅为已发射的观测值发射值,这是行不通的,因为这样你就不知道哪一个没有发射。当然,它可能发出了
null
。但是考虑到通过组合运算符可以实现这一点,我认为它不会改变。forkJoin()从每个可观察对象发出最后发出的项。在这种情况下没有要发出的项。但是调用observer.complete()不应该触发forkJoin吗,因为其他观测者确实产生了值?不,要使forkJoin正常工作,需要发出并完成所有内容。Fork-joins接口返回与其参数匹配的数组,因此它不能返回比其参数短的数组。如果每个项目都没有发出,那么它需要假设应该有什么(null?undefined?),它不应该这样做。在使用concat而不是forkjoin之后,您可以轻松地重新构建事物,以实现您看起来的目标。