错误:类型不是ES5 / ES3中的有效异步函数返回类型,因为它未引用Promise兼容的构造函数

use*_*801 24 promise angular

我已经在TypeScript中编写了此函数:

export class LoginService {

    async isLoggedIn(): boolean {
      const r = await this.http.get('http://localhost:3000/api/user/isLoggedIn').toPromise();
      return r.body;
    }

}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行Angular 6应用程序时,出现以下错误消息:

src / app / login.service.ts(28,23)中的错误:错误TS1055:类型'boolean'在ES5 / ES3中不是有效的异步函数返回类型,因为它没有引用Promise兼容的构造函数值。

我之前在其他应用程序中使用过async / await,而之前并没有实现。

更新:我想回答的问题是:如何获取“ isLoggedIn”函数以返回布尔值?

jfr*_*d00 18

一个async函数只能通过定义async返回承诺-所有函数都返回承诺。它不能返回布尔值。

这就是TypeScript告诉您的。该async函数可以返回解析为布尔值的Promise。

returnasync函数内部获得的值将成为async函数返回的承诺的可解析值。因此,async函数的返回类型是一个promise(解析为布尔值)。

的调用者isLoggedIn()必须.then()与其await一起使用。

export class LoginService {

    async isLoggedIn(): Promise<any> {
      const r = await this.http.get('http://localhost:3000/api/user/isLoggedIn').toPromise();
      return r.body;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 但是为什么我不能在“isLoggedIn()”函数中使用 await 并返回一个布尔值?但是除非我使用异步,否则我不能使用等待?但是如果我使用异步,我不能返回一个布尔值?似乎有点catch-22? (7认同)
  • @ user275801 - 正如我已经说过的,你对返回的承诺使用 `await` 或 `.then()`。`xxx.isLoggedIn().then(bool =&gt; { /* 使用这里的值 */})`。请参阅[如何从异步调用返回响应](/sf/ask/995422501/#14220323)更多信息并阅读更多关于使用 `async` 关键字声明的函数。 (3认同)
  • 您可能需要升级到 ES6。它明确指出 [here](https://javascript.info/async-await#await) 您的假设是正确的。否则,为什么要费心等待并立即返回大坝承诺! (2认同)

Ian*_*Ian 5

如果您的端点/api/user/isLoggedIn仅返回一个布尔值,您应该能够通过强制转换 http get 方法来使用下面的内容。但实际上你只能从异步函数返回一个承诺。

export class LoginService {
  async isLoggedIn(): Promise<boolean> {
    return this.http.get<boolean>('http://localhost:3000/api/user/isLoggedIn').toPromise();
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以有一个isLoggedIn()像这样消耗的异步函数:

async doSomething() {
  const loggedIn: boolean = await service.isLoggedIn();
  if (loggedIn) {
    doThis();
  }    
}
Run Code Online (Sandbox Code Playgroud)

这将被称为这样

await doSomething();
Run Code Online (Sandbox Code Playgroud)