Angular2,TypeScript,离子2代码执行顺序

Angular2,TypeScript,离子2代码执行顺序,angular,typescript,ionic2,Angular,Typescript,Ionic2,我这里有一个有趣的情况,我试图理解哪种方法是编写此代码的最佳方法 我有一个服务,我用它注入一个组件,从服务器获取数据,服务器返回一个可观察的数据。 代码如下: getDataFromServer(): Observable<any> { this.storage.get('access_token').then((access_token) => { let headers = new Headers({ 'Content-Type': 'applica

我这里有一个有趣的情况,我试图理解哪种方法是编写此代码的最佳方法

我有一个服务,我用它注入一个组件,从服务器获取数据,服务器返回一个可观察的数据。 代码如下:

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); 
}
getDataFromServer():可观察{
this.storage.get('access\u token')。然后((access\u token)=>{
let headers=新的头({'Content Type':'application/x-www-form-urlencoded','Authorization':'Bearer'+access_token});
let options=newrequestoptions({headers:headers});
});
返回此.http.get(config.apiclesurl,options)
.map(此.extractData)
.接住(这个.把手错误);
}
正如你在这里看到的,这个方法期望返回可观察的。它还有一个在方法体内执行的存储方法,该方法返回一个承诺,其中包含使用承载令牌从服务器获取数据所需的结果数据

现在,Typescript抱怨说,在这种情况下,由于作用域问题,options变量此时未定义。如果我在.then(函数)主体之外定义了options变量,那么由于承诺执行,所有时间options变量都将为空,因此我可以向服务器进行身份验证

如果我输入
则返回this.http.get(config.apiclesurl,options).map(this.extractData).catch(this.handleError)
主体内的代码>类型脚本将抱怨Observable需要从该方法返回

重要的一点是,我正在使用来自'@ionic/Storage'的import{Storage}; 无论何时使用.get方法,它都会返回一个承诺,这不是更改第三方核心代码的好做法

问题是:编写这段代码的最佳方式是什么?因此,每当我订阅Observable时,我将结合Promise和Observable对用户进行身份验证

我希望我问的问题是正确的,如果有可能分享一些链接,这些链接都是以一种干净的方式解释的,这将是非常有用的


干杯。

以下是我如何解决这个问题的

我已将服务方法重组为如下所示:

  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);
     });
   }

而且效果很好。尽管如此,我还是不能说注释后的解决方案不是一个好的解决方案(要实现的更好的实践),但是因为有不同类型的情况,我想分享这种类型的解决方案

以下是我如何解决这个问题的

我已将服务方法重组为如下所示:

  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);
     });
   }

而且效果很好。尽管如此,我还是不能说注释后的解决方案不是一个好的解决方案(要实现的更好的实践),但是因为有不同类型的情况,我想分享这种类型的解决方案

您不应该同时使用Observable和Promise,因为它们都是两个端点。如果你需要更多的信息,你可以在这里看到最好的方法让我知道我刚刚快速更新了我的问题。我认为我无法实现您刚才与我共享的解决方案,因为我无法从@ionic/Storage module更改本例中的第三方代码(存储)。您可以使用使用方式和通用方式处理服务。您不应同时使用Observable和Promise,因为两者都是两个端点。如果你需要更多的信息,你可以在这里看到最好的方法让我知道我刚刚快速更新了我的问题。我认为我无法实现您刚才与我共享的解决方案,因为我无法从@ionic/Storage module更改本例中的第三方代码(存储)。您可以使用使用方式和通用方式处理服务