2017-02-12 3 views
0

コードをフラットに保つことができるので、標準Promise構文よりもasync awaitパターンを使用し始めています。私は彼らと少し演奏し、実験したとと思った私はそれらを使用する方法を理解した。TypeScript async awaitは必ずしも待っているとは限りません(ブロックして戻ってきます)

これは今すぐ下がりました!

私は約束を返す関数...

private async checkSecurityTokenForNearExpiry(): Promise<boolean> { 
     const expiryOffset = 10; 
     try {  
      let existingToken = await this.userAuthorisationService.getSecurityToken(); 
      if (existingToken != null && !existingToken.isTokenExpired(expiryOffset)) { 
      return true; 
      } 

      // Attempt to get a new token. 
      this.logger.debug('checkSecurityTokenForNearExpiry requesting new token.'); 
      this.getSecurityTokenWithRefreshToken().subscribe(obs => { 
      return true; 
      }, 
      error => { 
      // All errors already logged 
      return false; 
      }); 
     } catch (error) { 
      this.logger.error(`checkSecurityToken ${error}`); 
      return false; 
     } 
     } 

これは約束を返し、また、観察可能であり、他の関数を呼び出すことが起こるを持っていますが、これはすべてOKのようです。次のように私は、この関数を呼び出す

...

this.getDataStoreValues().then(async() => { 

     await this.checkSecurityTokenForNearExpiry(); // <-- not waiting 

     requestData(); // <-- this is called before checkSecurityTokenForNearExpiry returns 
     ... 

これは(?[OK]をする必要があり)asyncとしてマークされた別の約束thenコールバック、内部にあるが、私のアラームにthis.checkSecurityTokenForNearExpiry()への呼び出しではありません私はrequestData()が呼び出される前に終了しました。 booleanの結果がcheckSecurityTokenForNearExpiryである必要はありませんが、何かを返すと違いが出るかどうかを確認するためにこれを追加しましたが、違いはありません。

私はここで迷っています!

私がここで紛失していることを知っている人はいますか?

ありがとうございます!

答えて

1

async/awaitは期待どおり動作していますが、コードが正常に動作しないようにする2つの要因があります。

  1. オブザーバブルには、async関数との特別な対話はありません。これは彼らが火であり、彼らが通常の機能にあるように忘れていることを意味します。 getSecurityTokenWithRefreshTokenを待っているわけではありませんが、awaitとした場合でも、Promiseにラップされたsubscribeへの呼び出しによって返されたサブスクリプションであるため、必要に応じて動作しません。 によってコールバックが返されるのではなく、戻り値が返されないようにするため、Observable実装は結果を伝播しません。あなたは、あなたが次のインポート

    import 'rxjs/add/operator/toPromise'; 
    
    を追加する必要がありRxJSを使用している場合は、

    async checkSecurityTokenForNearExpiry(): Promise<boolean> { 
        const expiryOffset = 10; 
        try { 
         let existingToken = await this.userAuthorisationService().getSecurityToken(); 
         if (existingToken != null && !existingToken.isTokenExpired(expiryOffset)) { 
          return true; 
         } 
         // Attempt to get a new token. 
         this.logger.debug('checkSecurityTokenForNearExpiry requesting new token.'); 
         try { 
          await this.getSecurityTokenWithRefreshToken().toPromise(); 
          return true; 
         } catch (error) { 
          return false; 
         } 
        } catch (error) { 
         this.logger.error(`checkSecurityToken ${error}`); 
         return false; 
        } 
    } 
    

    注意を次のようにPromiseObservableを変換する必要があり、この作業を行うためには

+1

詳細な説明をありがとう!それは問題であったObservableでした。 'toPromise()'はそれを修正し、それをPromiseにラップして手動で 'resolve 'する必要がありません。(' getSecurityTokenWithRefreshToken() 'のオブザーバブルで' complete() 'を呼び出す必要があります。戻っていない、私も逃していた)。私が気づくべきもう一つ。 – peterc

+0

興味深いことに「完全」については、私はそれを考慮しなかった –

関連する問題