订阅函数中未定义的组件变量

时间:2019-04-22 13:31:33

标签: javascript angular rxjs

我正在组件中的ngOnInit内部进行API调用。 API返回类型为Player的数组。

每个Player对象都有一个属性Position。我正在将rxjs的switchMap中的API调用结果映射到名为players的组件变量。

.subscribe中,我尝试遍历结果,并将.push的对象复制到另一个组件数组,具体取决于position的{​​{1}}属性。 / p>

但是,当我尝试player对象时,每个位置数组(goalkeepersdefendersmidfieldersforwards)都是未定义的。

push

this.http.get<Player[]>(url) .pipe( switchMap(result => { return this.players = result; }) ) .subscribe(result => { for (let i = 0; i < this.players.length; i++) { if (this.players[i].position == 1) { this.goalkeepers.push(result[i]); } } }, error => console.error(error)); this.players均为this.goalkeepers类型。

我在这里的理解是,for循环将继续遍历this.players中的每个玩家,并将它们分配给适当的位置数组,但是位置数组未定义。

在这种情况下,错误显示为player[]。因此,我的理解是Cannot read property 'push' of undefined是未定义的。

1 个答案:

答案 0 :(得分:0)

不需要switchMap(),可以在可观察对象的players下设置tap()属性。要在goalkeepers中推送数据,您必须先对其进行初始化。

this.goalkeepers: Player[] = []    

this.http.get<Player[]>(url).pipe(
        tap(result => this.player = result)
      )
      .subscribe(result => {
        for (let i = 0; i < this.players.length; i++) {
          if (this.players[i].position == 1) {
            this.goalkeepers.push(result[i]);
          }
        }
      }, error => console.error(error));

如果您有tap()的多个订阅并且不想单独分配players(可以在{下执行此操作,则可以使用this.http.get<Player[]>(url)来设置players {1}}本身)。如果只有一个订阅,则可以在订阅下进行分配。