错误:类型不是 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
函数可以返回一个解析为布尔值的承诺。
return
在async
函数中的值成为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 => /* 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 兼容的构造函数的主要内容,如果未能解决你的问题,请参考以下文章