不幸的是,我需要从中检索数据的站点设置方式是,这些数据分布在多个站点(完全相同类型的数据和JSON返回格式),但它们位于不同的URL。它们按网址分类,因此我需要保留网址,以便在整个应用中进一步对其进行分类。我有以下服务功能,我试图传递一组主题(然后传递给URL),检索数据并返回单个observable。但是,这没有任何回报:
getDataTopicItems(topicArray) {
return this.items = topicArray.forEach((topic, i, topicArray) => {
return this.http.get(this.baseUrl + topic + "/_api/Web/Lists/GetByTitle('What''s New')/items", this.options)
.map(res => res.json())
.map(items => items.d.results)
.do(data => console.log(data))
.concatMap(data => data)
}
)
}
我在组件的模板中订阅它,我通过* ngFor加上异步管道调用此函数。我做错了什么?
更新:我还尝试了以下内容:
return this.http.get(this.baseUrl + topicArray[0] + this.policyOptions, this.options)
.map(res => res.json())
.map(items => this.policies = items.d.results)
.do(data => console.log(data))
.flatMap((policies) => topicArray.forEach((topic, i, topicArray) => {
if (i < 0) {
this.http.get(this.baseUrl + topic + this.policyOptions)
.map(res => res.json())
.map(items => this.policies = items.d.results)
.do(data => console.log(data))
}
}))
答案 0 :(得分:4)
Array.forEach
方法的回调函数不希望收到任何内容,因此您可能希望改为使用Array.map
。
如果您正在寻找“更多RxJS”方法,可以使用mergeMap
执行以下操作:
return Observable.from(topicArray)
.mergeMap(topic => this.http.get(this.baseUrl + topic + "/_api/Web/Lists/GetByTitle('What''s New')/items", this.options)
.map(res => res.json())
.map(items => items.d.results)
.do(data => console.log(data))
.concatMap(data => data);
最终,您可以使用concatMap
代替mergeMap
按顺序运行所有请求并使用concatAll
代替.concatMap(data => data);
,这样可以让您更加明显地尝试要做。
顺便说一下,请注意,使用this.items = ...
只是将一个Observable分配给this.items
而不是结果。
另请注意,如果要获得任何结果,则需要订阅返回的Observable。例如:
getDataTopicItems([...]).subscribe(result => this.items = result);
答案 1 :(得分:1)
Array.prototype.forEach
返回undefined
。 See MDN for documentation。请改用Array.prototype.map
,this.items
将是一个可观察的数组,您可以随意执行任何操作。