TypeScript async await似乎并不总是等待("阻止并返回")

时间:2017-02-12 01:34:18

标签: javascript angular typescript async-await

我开始比标准的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 "." 的结果,但只是为了看看返回的内容是否有所不同,但它没有。

我迷失在这里!

有谁知道我在这里缺少什么?

提前致谢!

1 个答案:

答案 0 :(得分:1)

async / await按预期工作,但有两个因素阻止您的代码正常运行。

  1. Observable与async函数没有特殊的互动。这意味着它们就像正常功能一样发射并且忘记它们。您没有等待getSecurityTokenWithRefreshToken,但即使您执行了await,它仍然不会按您的意愿行事,因为结果实际上是调用subscribe包含的订阅所返回的订阅Promise

  2. subscribe作为参数的回调不是为了返回值,因此从它们返回没有效果,因为Observable实现不会传播它们的结果。

  3. 为了完成这项工作,您需要将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';