【发布时间】:2020-11-30 22:34:18
【问题描述】:
我有一个返回 observable 的函数
getData(){
return this.http.get<{mat: any[], mat_auf: any[], mat_lok: any[], auf_an: any[]}>(this.authUrl + 'get/mat-data').pipe(
map(({mat, mat_auf, mat_lok, auf_an}) => {
console.log("AuthService", {mat, mat_auf, mat_lok, auf_an}); // correct data format
mat.map(mat => {
this.matAdapter.adapt(mat);
});
mat_auf.map(mat_auf => {
this.mat_aufAdapter.adapt(mat_auf);
});
mat_lok.map(lok => {
this.lokAdapter.adapt(lok)
});
auf_an.map(an => {
this.aufAdapter.adapt(an)
});
})
);
}
如果我查看控制台,适配器的转换工作正常,但是当我尝试订阅另一个组件中的 Observable 时,我得到未定义:
ngOnInit(){
this.authSrv.getData().subscribe(res => console.log(res)) // res is undefined but why?
}
适配器如下所示:
@Injectable({
providedIn: "root"
})
export class MatAdapter implements Adapter<Mat>{
adapt(mat: any): Mat {
return new Mat(mat.ID, mat.name, mat.location);
}
}
正如我所说,适配器工作正常,因为在控制台中记录了正确的对象。 但是,当我尝试订阅 observable 时,为什么数据未定义? 我想我用错了地图功能。
感谢任何帮助。如果需要更多信息,请发表评论。 谢谢
【问题讨论】:
-
console.log()总是返回undefined!!!所以如果你映射到console.log(something)你logsomething* but *produce* the valueundefined`的值。 -
@VLAZ 嘿,我刚刚使用了 console.log 来查看转换是否正确。但是如果我省略了 console.log 部分,数据仍然是未定义的。我改变它以避免误解。谢谢!
-
哦,另外,在带有
.map的第一个块中,您甚至没有return语句。所以当getData()被调用时,它会调用`this.http.get().pipe(map())`但是没有映射结果。隐式返回总是undefined。 “嘿,我刚刚使用了 console.log 来查看转换是否正确”请不要使用map进行简单的迭代。使用forEach或实际循环。一开始就极具误导性。 -
我建议阅读Is performing a mapping operation without using returned value an antipattern?,因为这正是这里的问题 - 对某些数据执行映射而不返回任何内容。
-
作为特定于
rxjs的附加提示:如果您想在不更改可观察对象的情况下对可观察对象执行副作用,rxjs提供了tap运算符。这将替换您示例中的外部地图。
标签: angular typescript rxjs mapping observable