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

Posted

技术标签:

【中文标题】错误:类型不是 ES5/ES3 中的有效异步函数返回类型,因为它没有引用与 Promise 兼容的构造函数【英文标题】:Error: Type is not a valid async function return type in ES5/ES3 because it does not refer to a Promise-compatible constructor 【发布时间】:2019-03-12 15:52:20 【问题描述】:

我已经用 TypeScript 编写了这个函数:

export class LoginService 

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


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

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

我之前在其他应用程序中使用过 async/await 之前没有遇到过这个问题。

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

【问题讨论】:

【参考方案1】:

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

这就是 TypeScript 告诉你的。 async 函数可以返回一个解析为布尔值的承诺。

returnasync 函数中的值成为async 函数返回的承诺的解析值。因此,async 函数的返回类型是一个承诺(解析为布尔值)。

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;
    


【讨论】:

但是为什么我不能在“isLoggedIn()”函数中使用 await 并返回一个布尔值?但是除非我使用异步,否则我不能使用等待?但是如果我使用异步,我不能返回布尔值?似乎有点赶上 22? 您只能在将返回承诺的异步函数中使用 await。我们说的是 javascript,它是一个异步函数,将根据 API 响应返回。 好的 感谢您的回复。我更新了我的问题,以更准确地反映我实际想要做的事情。基本上,该函数执行异步 api 调用,我希望它等待/阻塞,直到它获得一个具体值(布尔值),然后返回布尔值。不是承诺。 @user275801 - 正如我已经说过的,您使用 await.then() 与返回的承诺。 xxx.isLoggedIn().then(bool =&gt; /* use the value here */)。有关更多信息,请参阅 How do I return response from an asynchronous call 并阅读有关使用 async 关键字声明的函数的更多信息。 你可能需要升级到 ES6。它明确指出here 你的假设是正确的。否则,何苦等待并立即返回大坝承诺!【参考方案2】:

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

export class LoginService 
  async isLoggedIn(): Promise<boolean> 
    return this.http.get<boolean>('http://localhost:3000/api/user/isLoggedIn').toPromise();
  

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

async doSomething() 
  const loggedIn: boolean = await service.isLoggedIn();
  if (loggedIn) 
    doThis();
      

会这样称呼

await doSomething();

【讨论】:

以上是关于错误:类型不是 ES5/ES3 中的有效异步函数返回类型,因为它没有引用与 Promise 兼容的构造函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TypeScript 中定位 ES2018?

转译时排除 *.spec.ts 文件,但仍能正确 lint

Promise.all()函数中的JS“等待仅在异步函数中有效”[重复]

使用猫鼬的异步函数中的返回类型会产生错误

回调不是异步库中的函数

我收到“等待仅在异步函数中有效”错误我的代码是这样的 [重复]