【问题标题】:forkJoin is not working. But no errors too [duplicate]forkJoin 不起作用。但也没有错误[重复]
【发布时间】:2018-07-25 18:07:57
【问题描述】:

更新:

很奇怪。我必须使用.valueChanges().pipe(first())。然后它工作正常。这种行为有什么线索吗?是firestore 问题还是angularfire2?如果我将使用该模式,那么我将错过这里的实时数据库功能。那我该怎么办呢?

看来我在这里做错了。你能告诉我问题出在哪里吗?它没有给出任何错误。但它也不起作用。

注意: this.budgetGroups$ 没有任何值。但是this.defaultBudgetGroups$ 有价值。有什么线索吗?

select-budget-group.ts

import { Observable } from 'rxjs/Observable';
import { forkJoin } from 'rxjs/observable/forkJoin';
import { concat } from 'lodash';

budgetGroups$: Observable<BudgetGroup[]>; defaultBudgetGroups$: Observable<BudgetGroup[]>

 constructor(){}

 ionViewDidEnter() {
   this.getAllBudgetGroups();
 }

 getAllBudgetGroups() {
  this.budgetGroups$ = this.budgetGroupProvider.getAllTempBudgetGroups().valueChanges();
  this.defaultBudgetGroups$ = this.budgetGroupProvider.getDefaultBudgetGroups().valueChanges();

  forkJoin([this.budgetGroups$, this.defaultBudgetGroups$]).subscribe(res => {
      this.budgetGroupSortedList = concat(res[0], res[1]);
    }, err => {
      console.log(err);
   });
  }

provider.ts

  getDefaultBudgetGroups(): AngularFirestoreCollection<BudgetGroup> {
    return this.fireStore.collection(`defaultBudgetGroups`);
  }

 getAllTempBudgetGroups(): AngularFirestoreCollection<BudgetGroup> {
    return this.fireStore.collection(`members/${this.authenticationProvider.member.id}/budgetGroups`);
  }

【问题讨论】:

  • 可能很傻,但是 getAllBudgetGroups() 是否在您的 OnInit() 挂钩中被调用?你是说当 ForkJoin 发出时,budgetGroup 没有值吗? ForkJoin 不起作用怎么办?
  • 其实this.budgetGroups$ 没有价值。但是this.defaultBudgetGroups$ 在我的用例中很有价值。 What about ForkJoin isn't working?它应该返回this.defaultBudgetGroups$ 的所有值。但它不返回任何东西。有什么线索吗?也请查看我帖子上的更新。 @joshrathke
  • 我还是有点不清楚。 this.budgetGroup$ 甚至发出一个空数组吗? ForkJoin 在所有 Observable 发出至少一个值之前不会返回任何内容。
  • 哦..那么我应该在这里使用哪个运算符?这个this.budgetGroup$ 可以是nullundefine 或其他任何时候。那么哪个运营商适合这里呢? @joshrathke
  • 该数据是否相互依赖?如果不是,您可以将它们分成不同的订阅。有没有办法让你的this.budgetGroup$ 至少发出一个空数组或其他东西?我对 Firebase 不熟悉???所以我不知道,但您似乎希望您的 API 至少返回一些东西,即使它没有找到任何数据。这将是理想的解决方案,尤其是在 RxJs 环境中。

标签: angular rxjs ionic3 google-cloud-firestore angularfire2


【解决方案1】:

应该是:

forkJoin(this.budgetGroups$, this.defaultBudgetGroups$).subscribe(res => {
    this.budgetGroupSortedList = concat(res[0], res[1]);
  }, err => {
     console.log(err);
 });
}

** 注意 forkJoin 参数的解构数组符号已被删除。

或者,你可以这样做:

forkJoin([this.budgetGroups$, this.defaultBudgetGroups$]).subscribe((result1, result2) => {
    this.budgetGroupSortedList = concat(result1, result2);
  }, err => {
     console.log(err);
 });
}

** 注意传递给订阅处理程序的参数不再是一个数组

forkJoin的用法基本上是:

forkJoin(array).subscribe((p1,p2,p3,etc)=> {...})

forkJoin(p1,p2,p3,etc).subscribe((array)=> {...})

【讨论】:

  • 我已经尝试了第一个。它仍然无法正常工作。第二种方法有一个编译时错误。 Argument of type '(result1: any, result2: any) =&gt; void' is not assignable to parameter of type '(value: BudgetGroup[][]) =&gt; void'.。有什么线索吗?
  • 对于第二种方法,您是否在 forkjoin 参数周围添加回数组表示法?
  • 是的,我在上面复制了你的一份。但还没有运气?
  • 抱歉,不知道还有什么问题...
  • 个人subscribe 工作正常。但不是forkjoin。有什么线索吗?
猜你喜欢
  • 2021-07-08
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 2020-04-08
相关资源
最近更新 更多