rxjs:forkJoin 是否需要至少调用 next 才能完成?
rxjs: Does forkJoin need at least one call to next to complete?
我有两个要 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);
});
其中一个 observable 只调用完成。现在我发现 forkJoined observables 永远不会被触发。我必须在 badObservable 中调用 observer.next() 才能执行 forkJoin 上的订阅。
我预期的行为是 forkJoin-subscribes 将使用仅包含一项的数组执行:['something']
这是一个错误,还是我没有正确理解这个概念?
我为此做了一个 plunkr:https://plnkr.co/edit/QaA9DwyWAmTGbthvguPK?p=preview
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 的可观察对象:
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);
});
其中一个 observable 只调用完成。现在我发现 forkJoined observables 永远不会被触发。我必须在 badObservable 中调用 observer.next() 才能执行 forkJoin 上的订阅。
我预期的行为是 forkJoin-subscribes 将使用仅包含一项的数组执行:['something']
这是一个错误,还是我没有正确理解这个概念?
我为此做了一个 plunkr:https://plnkr.co/edit/QaA9DwyWAmTGbthvguPK?p=preview
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
。但考虑到这可以通过组合运算符来实现,我认为它不会改变。