2017-06-16 18 views
2

ほとんどすべてのREST要求でユーザーIDが必要です。

ユーザーにログインすると、トークンをローカル記憶域に渡し、IDをuser.service.tsに(関数setUserId(userId)で)渡しますが、トークンでユーザーを認証すると(ユーザーはログインしていますが、私はUserオブジェクトからuserIdを取得しようとします(トークンによってREST要求からユーザーオブジェクトを取得します)。

私のコードのこの部分は次のようになります。

getUser() { 
    var authToken = localStorage.getItem('authorization') 

    if(!this.userPromise){ 
     let headers = new Headers(); 
     headers.append('Content-type', 'application/json'); 
     headers.append('Authorization', authToken); 

     this.userPromise = this.http.get(
     'http://localhost:8080/api/user', 
     { headers } 
    ).toPromise() 
     .then((res) => res.json()); 
    } 

    return this.userPromise; 
    }; 




getUserId(){ 
    var $self = this; 

    if($self.userId){ 
     return $self.userId; 
    } else { 
     $self.getUser().then(function(result){ 
     $self.setUserId(result.id); 
     console.log(result.id); 
     return result.id; 
     }); 
    } 
    } 

すべての要求は、ユーザーIDを要求したとき、私が使用しgetUserId()とユーザー Idが定義されている場合、私は確認してください。もしこのデータで応答が定義されていれば、私はこのデータをgetUser()関数から取得します。

私は1つの問題を解決できません。この要求は非同期で、たとえば "task"サービスはuserIdの値を未定義として設定します。この新しい値を待つことはありません。

どのようにこの問題を管理できますか?

--- EDIT

レンタルが要求される - それは、応答を待つdoens't。

getUserTasks() { 
    // return this.userService.getUserId(); 
    var userId = this.userService.getUserId(); 

    return this.http.get(
     'http://localhost:8080/api/private/'+userId+'/tasks' 
     // 'http://localhost:8080/api/private/1/tasks' 
    ) 
    .toPromise() 
     .then((res) => res.json()); 
    } 
+0

あなたはplnkerを提供できますか? –

+0

テンプレートの値をどのように使用しているかを表示できますか?だから私はあなたにそれを達成する最も速い方法を与えることができます。あなたは小さな仕事のためにあまりにも多くの仕事をしているようです。 –

+0

私のテンプレートには私だけがあります: {{data | async}} 私はng-if = "user.id"でフレームにeverythinkをロードできますが、この場合は良い解決策ではありません。 –

答えて

2

私は解決策を見つけた - 一方のみを行うように思う)(getUserTasksに非同期/のawait機能を使用するための適切な方法である:

async getUserTasks() { 
    let userId = await this.userService.getUserId(); 

    return this.http.get(
     'http://localhost:8080/api/private/'+userId+'/tasks' 
    ) 
    .toPromise() 
    .then((res) => res.json()); 
    } 

--- EDIT ---最後に

- 誰かが同じ問題を見つけた場合、私は自分の変更レベルを認証プロセスに移します。このようにして、私はUserService.getUserId();サービスによってアプリケーションの任意の部分からuserIdにアクセスできます。

ユーザがログインすると、すべてのデータを変数に入れる時間がありますが、認証だけを行うとisLoggedIn()関数が非同期/待機に変更されます。チケットが存在する場合、私はUserオブジェクトを取得するための認証要求を送信します。

ユーザオブジェクトを取得した場合、trueを返し、userIdをuserIdサービスに配置します。エラー(クレデンシャルなし)を取得すると、getUser()関数でログアウトアクションを実行します。

私はこれが最善の解決策だと考えています。それは必要なすべてのデータを提供し、追加の検証プロセスを慎重に提供します。

async isLoggedIn() { 
    var $self = this; 

    if(localStorage.getItem("authorization")){ 
     var user = await $self.getUser(); 
     this.setUserId(user.id); 

     return true; 
    } else { 
     return false; 
    } 
    } 
+0

うれしいことに、ちょうどあなたに知らせるために、非同期/遠距離通信は、フードの下で約束を使用します。 [ここをクリック](https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8)あなたがそれについてもっと知りたいなら、良い投稿です –

+0

ありがとうあなたの助け@オムリ・ルソン –

関連する問題