2017-02-23 38 views
0

Im我的Ionic应用程序(Angular> Angular2)主要使用promises/observables进行迁移时遇到了一些麻烦。使页面上的http.get在Angular2/Ionic的提供者中可观察到

这是我在CartPage方法:

this.cartService.list().subscribe(
data => { 
    console.log(data); 
    this.cartData = data.cart; 
err => { 
    console.log(err); 
}); 

而在车商

list() { 

    this.storage.get('token') 
    .then((token) => { 

     var authHeader = new Headers(); 
     authHeader.append('Authorization', 'Bearer ' + JSON.stringify(token).replace(/['"]+/g, '')); 

     this.http.get(this.global.getApiUrl()+'cart/list', { 
      headers: authHeader 
     }) 
     .map(res => res.json()) 
     .subscribe(
      data => { 
       this.data = data.data; 
       return this.data; 
      }, 
      err => { 
       console.log(err); 
      } 
     ); 

    }); 

} 

,但我得到:

打字稿错误 属性“订阅'在类型'void'上不存在。


所以我搜索和搜索,并没有在文档或在例子/教程中找到一个可观察的使用像这样工作。

我不知道我是否缺少声明类型,或者如果我没有使用订阅和使用一些不同的方法。

谢谢!

+0

你应该首先解析你的'this.storage.get('token')',那么你应该返回'this.http.get(...)。map(...)','subscriber'是像承诺的'then',但你必须提供一个'订户',如果不是可观察的将不被执行。 –

回答

0

购物车页面:

this.cartService.list(token).subscribe(
     data => { 
     console.log(data); 
     this.cartData = data.cart; 
     err => { 
     console.log(err); 
     }); 

车商:

list(token) { 
     var authHeader = new Headers(); 
     authHeader.append('Authorization', 'Bearer ' + JSON.stringify(token).replace(/['"]+/g, '')); 

     return this.http.get(this.global.getApiUrl()+'cart/list', { 
      headers: authHeader 
     }) 
     .map(res => res.json()); 

    } 

嗯,这是一个竞争条件,主要这里的问题是,你需要为HTTP请求,但你的令牌必须从Storage获得该信息,并且该操作是异步

找到一种方法在列表调用之前获取令牌。 最简单的方法是让Provider提供该数据并将其用作离子Storage提供程序的代理,因此当提供程序启动时,它会运行类似init()的运行并获取应用程序所需的基本数据,如令牌和其他的东西,那么你只需在CartProvider上注入该提供商,并致电myDataProvider.token