在Angular2/Ionic的提供者中使http.get在页面上可见

在Angular2/Ionic的提供者中使http.get在页面上可见,angular,ionic2,observable,Angular,Ionic2,Observable,我在迁移我的Ionic应用程序(Angular>Angular2)时遇到了一些问题,主要是因为有承诺/可观察 这是我在CartPage上的方法: this.cartService.list().subscribe( data => { console.log(data); this.cartData = data.cart; err => { console.log(err); }); list() { this.storage.get('toke

我在迁移我的Ionic应用程序(Angular>Angular2)时遇到了一些问题,主要是因为有承诺/可观察

这是我在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);
            }
        );

    });

}
在购物车提供商中:

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”上不存在属性“subscribe”


所以我搜索了又搜索,在文档或示例/教程中都没有找到像这样使用的有效的可观察性

我不知道我是否以某种方式遗漏了声明类型,或者我是否不应该使用subscribe和其他方法

谢谢

购物车页面:

   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请求的令牌,但您必须从
存储
获取该信息,并且该操作是异步的

在列表调用之前找到获取令牌的方法。
最简单的方法是让提供商保存该数据,并将其用作爱奥尼亚
存储
提供商的代理,因此当提供商启动时,它会运行类似
init()
的程序,并获取应用程序所需的基本数据,如令牌和其他东西,然后,您只需将该提供者注入您的
CartProvider
并调用
myDataProvider.token

您应该首先解决
这个.storage.get('token')
,然后您应该返回
这个.http.get(…).map(…)
订户
就像承诺的
然后
,但是您必须提供一个
订阅者
,如果不是,则不会执行可观察的。