2017-04-09 92 views
1

我在这里有一个有趣的情况,我试图了解哪些是编写此代码的最佳方式。Angular2,TypeScript,Ionic 2代码执行顺序

我有一个服务,我使用注入一个组件来从服务器获取数据返回一个observable。 下面是代码:

getDataFromServer(): Observable<any> { 
    this.storage.get('access_token').then((access_token) => { 
     let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Bearer ' + access_token }); 
     let options = new RequestOptions({ headers: headers }); 
    }); 

    return this.http.get(config.apiArticlesUrl, options) 
    .map(this.extractData) 
    .catch(this.handleError); 
} 

所以你可以在这里看到,预计该方法返回观测。它还有一个在方法体内部执行的存储方法,该方法返回一个承诺,其中包含使用承载令牌从服务器获取数据所需的结果数据。

现在,Typescript抱怨说,在这种情况下,由于范围问题,选项变量在此处未定义。如果我在.then(function)主体外部定义options变量,那么所有时间选项变量将由于承诺执行而为空,因此我可以向服务器进行身份验证。

如果我把return this.http.get(config.apiArticlesUrl, options).map(this.extractData).catch(this.handleError);放在.then(function{})内部,那么TypeScript会抱怨Observable需要从这个方法返回。

重要的是我使用'@ ionic/storage'中的import {Storage}; 无论何时使用.get方法,它总是返回一个Promise,这不是一个很好的练习来更改第三方核心代码。

问题是:编写这段代码的最好方法是什么,所以每当我订阅Observable时,我都会得到用户认证合并的Promise和Observable?

我希望我以正确的格式提出问题,以及是否可以分享一些链接,这些链接都以一种干净的方式进行解释,这将非常有用。

干杯。

+0

你不应该使用Observable和Promise,因为两者都是两个端点。你可以在这个[**答案**]中看到最好的方法(http://stackoverflow.com/questions/43305876/set-global-data-to-property-from-get-request-before-continue/43307401# 43307401)如果您需要更多信息,请告知我 – Aravind

+0

我刚刚更新了我的问题。我不认为我能够实施您刚刚与我分享的解决方案,因为我无法在@ ionic/storage模块中更改第三方代码(存储)。 – Rambo

+0

您可以使用使用方式和通用方式处理服务 – Aravind

回答

0

下面是我已经解决了这个问题。

我已经重新调整了服务的方法是这样的:

getDataFromServer(): Promise<any> { 
     return this.storage.get('access_token').then((access_token) => { 
      let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Bearer ' + access_token }); 
      let options = new RequestOptions({ headers: headers }); 

      return this.http.get(config.apiArticlesUrl, options); 
    }); 
    } 

在哪里,我想这要执行我用这个代码的地方:

this.dataService.getDataFromServer().then(
    (data) => { 
    console.log("data:",data); 
    data.subscribe((data)=>{ 
     console.log("This is the data : ", data); 
    }, 
    (err) => console.log("err :",err) 
    ) 
    }, 
    (err)=>console.log("err",err) 
) 

而且它的工作原理大。尽管如此,我仍然不能说评论的解决方案不是一个好的(更好的实施方式),但是由于我想分享这种类型的解决方案,有不同类型的情况。