Angular Service函数没有返回任何内容,尝试执行多个http请求并返回单个可观察的

时间:2017-06-06 16:02:36

标签: angular typescript rxjs

不幸的是,我需要从中检索数据的站点设置方式是,这些数据分布在多个站点(完全相同类型的数据和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))
                }
            }))

2 个答案:

答案 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);

查看现场演示:https://jsbin.com/nuzifo/9/edit?html,js,console

答案 1 :(得分:1)

Array.prototype.forEach返回undefinedSee MDN for documentation。请改用Array.prototype.mapthis.items将是一个可观察的数组,您可以随意执行任何操作。