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。但考虑到这可以通过组合运算符来实现,我认为它不会改变。