【问题标题】:Why is it not possible to return a forkJoin?为什么无法返回 forkJoin?
【发布时间】:2018-10-31 00:03:22
【问题描述】:

我不明白为什么我可以这样做

ForkJoin(service.Obs1(), service.Obs2()).subscribe

但是,如果我重构我的代码,以便向我的服务类添加一个返回 ForkJoin(this.Obs1(), this.Obs2()) 的方法,例如

updateWhatever(): Observable<[string, string]> {
return forkJoin([
  this.Obs1(),
  this.Obs(2)
]);}

然后如果我做service.updateWhatever().subscribe(res =&gt; //handle res[].,它会抛出错误

You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable

为什么这不起作用?人们应该能够以这种方式进行重构。我错过了什么?我意识到它返回了一个可观察的数组,但是为什么函数调用不处理这个呢?

也许我的问题是,如何处理返回 forkJoin 的方法?

【问题讨论】:

  • 为什么要将数组传递给第二个 forkJoin?
  • @Axel 可以返回 forkJoin ,在您的代码中,问题是 ob1 和 ob2 不是 observable、promise、array 或 Iterable。这就是 rxjs 抛出错误的原因。可以分享一下ob1和obj2的代码吗
  • @Axel,你用的是哪个版本的 Rxjs?
  • @Axel 我已经为你添加了一个代码示例。也许这也会得到一些想法

标签: angular typescript rxjs


【解决方案1】:

特定于 Rxjs 5 或更早版本:

forkJoin 不希望有 Array 的 Observable。它需要 SubscribableOrPromise

类型的源

你必须这样做:

updateWhatever() {
  return forkJoin(
    this.Obs1(),
    this.Obs(2)
  );
}

【讨论】:

  • 这不是真的,至少在 RxJS 6 中,见rxjs-dev.firebaseapp.com/api/index/function/forkJoin
  • 重点是 forkJoin 是用一个 rest 参数定义的,而不仅仅是一个普通的数组类型参数。 sources 之前的 ... 表示这一点。
  • 我同意@Picci,我们也可以在 forkJoin 中传递 observable 数组
【解决方案2】:

可以返回一个 forkJoin。在您的代码中,问题是 Obs1Obs2 不是 observable、promise、array 或 Iterable。这就是 rxjs 抛出错误的原因.

我同意@Picci 评论,我们也可以在 forkJoin 中传递 observable 数组

示例代码

const a = stream('a', 200, 3, 'partial');
const b = stream('b', 500, 3, 'partial');

someMethod().subscribe((response)=>{
  console.log(response);
});

someMethodFkAsAnArray().subscribe((response)=>{
  console.log(response);
});


function someMethod(){
  return forkJoin(a, b);
}

function someMethodFkAsAnArray(){
  return forkJoin([a, b]);

}

StackBlitz Demo 使用 RxJs 5.5.2

【讨论】:

  • 它们是可观察的。例如public getItem(): Observable&lt;Item&gt;
  • @Axel 您使用的是哪个版本的 RxJs?
猜你喜欢
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2014-08-27
  • 2015-04-06
  • 1970-01-01
相关资源
最近更新 更多