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之后,您可以轻松地重新构建事物,以实现您看起来的目标。