我有两个observable,我想forkJoin:
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);
});
其中一个可观察者只调用完整。现在我发现forkJoined observables永远不会被触发。我将不得不在badObservable中调用observer.next(),以便在forkJoin上执行订阅。
我的预期行为是forkJoin-subscribes将使用仅包含一个项目的数组执行:[' something']
这是一个错误,还是我没有正确理解这个概念?
我为此做了一个傻瓜:https://plnkr.co/edit/QaA9DwyWAmTGbthvguPK?p=preview
答案 0 :(得分:3)
forkJoin()
从每个observable发出最后一个发射项。在这种情况下没有要发出的项目,因此操作员不会发出。
务实的解决方案是在每个可观察对象上调用.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
。但鉴于这可以通过合并运营商来实现,我不认为它会改变。