我开始比标准的Promise语法更多地使用async await
模式,因为它可以使代码更平坦。我已经玩过并尝试了一下思考我明白了如何使用它们。
现在已经崩溃了!
我有一个返回Promise的函数......
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;
}
}
这会调用其他函数来返回一个promise并且也在Observable上,但所有这些似乎都没问题。
然后我按如下方式调用此函数......
this.getDataStoreValues().then(async () => {
await this.checkSecurityTokenForNearExpiry(); // <-- not waiting
requestData(); // <-- this is called before checkSecurityTokenForNearExpiry returns
...
这是在标记为then
的另一个Promise async
回调中,(应该没问题?),但是在我看到{this.checkSecurityTokenForNearExpiry()
之前,对requestData()
的调用尚未完成{1}}被召唤。我不需要boolean
checkSecurityTokenForNearExpiry
parsley_file()
{
AtomicParsley "$1" --artwork cover.jpg --overWrite
}
doforeach_arg()
{
local callback="$1"
shift
local arg
for arg in "${@}"; do "${callback}" "${arg}"; done
}
parsley_dir()
( # use '(',')' for subshell so shopt only affects this function
local dir="${1}"
shopt -s nullglob
doforeach_arg parsley_file "${dir}"/*.m4a
)
find_dirs()
{
find "${1}" -type d | sort
}
doforeach_line()
{
local callback="${1}"
local line
while read line; do "${callback}" "${line}"; done
}
parsley_dirs()
{
find_dirs "${1}" | doforeach_line parsley_dir
}
parsley_dirs "."
的结果,但只是为了看看返回的内容是否有所不同,但它没有。
我迷失在这里!
有谁知道我在这里缺少什么?
提前致谢!
答案 0 :(得分:1)
async
/ await
按预期工作,但有两个因素阻止您的代码正常运行。
Observable与async
函数没有特殊的互动。这意味着它们就像正常功能一样发射并且忘记它们。您没有等待getSecurityTokenWithRefreshToken
,但即使您执行了await
,它仍然不会按您的意愿行事,因为结果实际上是调用subscribe
包含的订阅所返回的订阅Promise
。
subscribe
作为参数的回调不是为了返回值,因此从它们返回没有效果,因为Observable
实现不会传播它们的结果。
为了完成这项工作,您需要将Observable
转换为Promise
,如下所示
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;
}
}
注意,如果您使用的是RxJS,则可能需要添加以下导入
import 'rxjs/add/operator/toPromise';