不能在使用observables的函数中使用return语句

时间:2017-07-09 18:51:00

标签: angular asynchronous return angular2-observables

所以我刚才知道我不能在使用异步操作的函数中使用return语句,或者我可以,但我使用它不正确。我的想法是,我应该在我想要使用我正在抓取的数据的地方订阅obseravable,而不是仅仅在那个地方调用函数并使用return语句。

这是我的代码什么是更好的做事方式所以我不必使用return语句,或者更好的是,我怎么还能使用return语句。请注意我想使用observables,而不是promises,我不再看到promises中的值。

谢谢。

getService(url) {
    var value: any[] = [];
    this.http.get(url)
      .map(
        (response: Response) => {
          const data = response.json()
            .subscribe(
              (mappedData: any[]) => value = mappedData,
              (error) => console.log(error)
            )
              }
      );
    return value;
  }

3 个答案:

答案 0 :(得分:0)

我们可以这样返回json对象的值。

getService(url) {
 var value: any[] = [];
 var subscription = this.http.get(url)
                    .map(response => response.json() )
                    .subscribe(
                         mappedData => value = mappedData.data,
                         (error) => console.log(error)
                    );
 return value;  }
  1. 使用http.get()
  2. 将响应从.map()转换为json对象
  3. 然后.subscribe()到.map()的输出,这是转换后的json对象
  4. 最后从订阅数据中设置value ..返回值
  5. 请仔细阅读angular documentation以便更好地理解。

答案 1 :(得分:0)

根据我的理解:

getService(url) {
  var value: any[] = [];                            // (1)
  this.http.get(url)                                // (2)
      .map(response => response.json() )            // (3)
      .subscribe(                                   // (4)
          mappedData => value = mappedData.data,    // (5)
          (error) => console.log(error)             // (6)
    );
    return value;                                   // (7)
} 

调用getService()函数时......

  • 第1行执行并将值设置为空数组。

  • 第2行执行,执行Http get操作并设置Observable。

  • 第7行执行,返回现在仍为空的数组。

在某些时间点,当从服务器返回响应时......

  • 第3行执行将响应映射到JSON对象并将其提供给subscribe方法

  • 第5行执行,将本地值属性分配给mappedData的data属性,并且由于外部函数已经返回了该属性...所以没有对结果值进行任何操作。

这就是我理解这段代码的方式。如果我错了,请纠正我。

先前答案中引用的文档实际上显示的代码如下:

在名为HeroService的角色服务中:

  getHeroes(): Observable<Hero[]> {
    return this.http.get(this.heroesUrl)
                    .map(this.extractData)
                    .catch(this.handleError);
  }

请注意,这是返回Observable ...而不是属性。并且组件中的调用代码包括subscribe方法:

在名为HeroComponent的角色组件中:

getHeroes() {
  this.heroService.getHeroes()
                   .subscribe(
                     heroes => this.heroes = heroes,
                     error =>  this.errorMessage = <any>error);
}

答案 2 :(得分:0)

getService(url) {
 var value: any[] = [];
 var subscription = this.http.get(url)
                    .map(response => response.json() )
    subscription.subscribe(
                 mappedData => value = mappedData.data,
                (error) => console.log(error)
                 );
                return value;  }