2017-07-03 163 views
-1

我有一个过程:返回列表GET

products = [] 
getAllProducts(){ 
    this.http.get 
    (this.baseUrl + '/products').map((resp:Response) => resp.json()) 
     .subscribe(
     (data) => { 
      const products = data; 
      this.products = products; 
     }, 
     err => {} 
    ); 
    } 

它的工作,正确地接收分配列表中的产品变量。 我想将其更改为一个函数,该函数返回上述列表,以便我可以将此代码作为另一个组件的服务使用。 我想是这样的:

getAllProducts(){ 
    let localProds = []; 
    this.http.get 
    (this.baseUrl + '/products').map((resp:Response) => resp.json()) 
     .subscribe(
     (data) => { 
      const products = data; 
      localProds = products; 
     }, 
     err => {alert("ERROR: GET localhost:3000/products "); localProds = ['ERROR'];} 
    ); 
    return localProds; 
    } 
this.products = this.getAllProducts(); 

,我认为它应该工作,但事实并非如此。我有两个问题:

1)为什么上述解决方案不起作用?

2)如何使这个函数返回收到的列表,在这种情况下JSON的列表。

编辑:我同意问题2可能已被标记为重复,如果只有我意识到事实,像异步调用这样的问题存在。由于我不知道,我仍然发现我的整个问题(这两个部分)对于像我以前这样的人来说是独一无二的,对于开发前端的新手来说,他们不知道“异步调用”这个术语。

+0

这是asyncronous的 – alehn96

+0

可能的复制过程(https://stackoverflow.com/questions/14220321/我怎么做 - 我从异步调用返回响应) – 2017-07-03 17:55:39

回答

0

评论回答了你的第一个问题......因为它是异步的,你不能像这样返回值。

这是我服务的方法是什么样子:

getProducts(): Observable<IProduct[]> { 
    return this._http.get(this._productUrl) 
     .map((response: Response) => <IProduct[]> response.json()) 
     .catch(this.handleError); 
} 

而且,在组件调用该服务的代码如下所示:

ngOnInit(): void { 
    this._productService.getProducts() 
      .subscribe(products => this.products = products, 
         error => this.errorMessage = <any>error); 
} 

的订阅方法使HTTP GET执行。当收到异步响应时,将执行作为第一个参数传递给subscribe方法的函数,将本地产品变量设置为从服务返回的产品。

我这里有一个完整的例子:我如何返回从一个异步调用的响应] https://github.com/DeborahK/Angular2-GettingStarted

+0

谢谢,我会尝试。 – Dawid