コードをフラットに保つことができるので、標準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
である必要はありませんが、何かを返すと違いが出るかどうかを確認するためにこれを追加しましたが、違いはありません。
私はここで迷っています!
私がここで紛失していることを知っている人はいますか?
ありがとうございます!
詳細な説明をありがとう!それは問題であったObservableでした。 'toPromise()'はそれを修正し、それをPromiseにラップして手動で 'resolve 'する必要がありません。(' getSecurityTokenWithRefreshToken() 'のオブザーバブルで' complete() 'を呼び出す必要があります。戻っていない、私も逃していた)。私が気づくべきもう一つ。 – peterc
興味深いことに「完全」については、私はそれを考慮しなかった –