rxjs:forkJoin至少需要一次调用才能完成吗?

时间:2017-12-05 18:25:12

标签: rxjs rxjs5

我有两个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

1 个答案:

答案 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。但鉴于这可以通过合并运营商来实现,我不认为它会改变。