如何从forkJoin返回处理结果

时间:2020-07-16 20:15:46

标签: javascript angular rxjs

我有一个userIds数组。例如:['jd', 'abc']。我正在遍历userIds以通过api获取全名。最后,我想将上面的数组变成[ {userId: 'jd', name: 'John Doe"}, {userId: 'abc', name: 'full name'}]

以下代码:我尝试在订阅内部返回arrEnriched,也尝试在forkjoinm外部返回。两者都没有按预期工作。

getUserObj(arr){
   const arrEnriched = [];
   forkJoin(arr.map((item)=> { 
      return this.userService.getUserName(item).pipe(pluck('name'));
   })).subscribe( (arrayOfHits)=>{
      const names = arrayOfHits.map(...);   // transform data
      arrEnriched = names.map(...);   // map from full name to object
      console.log(arrEnriched);  // as expected here 
      //return arrEnriched;

   });
   // return arrEnriched;
}

然后我尝试在ngOnInit()

中使用此功能
ngOnInit(){
     this.childOneComponent.users = this.getUserObj(this.arrUsers);
     this.childTwoComponent.users = this.getUserObj(this.anotherArrUsers);
}

谢谢。

1 个答案:

答案 0 :(得分:0)

函数getUserObj()是异步的。您无法同步从中返回数据。您可以改为返回可观察对象并在需要数据的地方订阅它。尝试以下

getUserObj(arr): Observable<any> {
  return forkJoin(arr.map((item) => {
    return this.userService.getUserName(item).pipe(pluck('name'));
  })).pipe(
    map(arrayOfHits => {
      const names = arrayOfHits.map(...);   // transform data
      return names.map(...);                // map from full name to object
    })
  );
}

ngOnInit() {
  this.getUserObj(this.arrUsers).subscribe((arrEnriched) => {
    this.childOneComponent.users = arrEnriched;
  });

  this.getUserObj(this.anotherArrUsers).subscribe((arrEnriched) => {
    this.childTwoComponent.users = arrEnriched;
  });
}

您可以找到有关如何访问异步数据here的更多信息。