我正在组件中的ngOnInit
内部进行API调用。 API返回类型为Player
的数组。
每个Player
对象都有一个属性Position
。我正在将rxjs的switchMap
中的API调用结果映射到名为players
的组件变量。
在.subscribe
中,我尝试遍历结果,并将.push
的对象复制到另一个组件数组,具体取决于position
的{{1}}属性。 / p>
但是,当我尝试player
对象时,每个位置数组(goalkeepers
,defenders
,midfielders
,forwards
)都是未定义的。
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
是未定义的。
答案 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}}本身)。如果只有一个订阅,则可以在订阅下进行分配。