异步函数的返回类型必须是全局 Promise<T> 类型

Posted

技术标签:

【中文标题】异步函数的返回类型必须是全局 Promise<T> 类型【英文标题】:The return type of an async function must be the global Promise<T> type 【发布时间】:2019-07-11 13:02:54 【问题描述】:

为什么 TSlint 仍然说“异步函数或方法的返回类型必须是全局 Promise 类型”?

我不明白出了什么问题。

更新:

【问题讨论】:

我想成功不是布尔类型。尝试在res... 之前的返回中添加双重否定!!,如果错误仍然存​​在,请告诉我 @MU,我也试过这个和明确的演员表 @MU,我认为 tslint 无法正常工作,但我不知道如何修复它 您是否尝试删除 : Promise ?它将隐式键入您的方法。它还可以帮助您了解它实际返回的内容。 @НикитаЛебедев 请确保这个返回的类型result.data.success 确实是 boolean 类型,而不是用引号括起来的布尔值,这使它成为一个字符串,比如“true”而不是true .能否请您在浏览器控制台的“网络”选项卡中检查,或者在该方法上放置一个断点? 【参考方案1】:

尝试返回与Promise 的预期泛型类型相对应的Promise-wrapped 值,如下所示:

@Action
public async register(registerInfo: Account): Promise<boolean> 
  const res = await http.post('users/', registerInfo);

  return new Promise<boolean>((resolve, reject) => 
    resolve(res.data.success);

    // Or reject() if something wrong happened
  );

  // Or simply return a resolved Promise
  return Promise.resolve(res.data.success);

其实你应该也可以then()结果:

@Action
public async register(registerInfo: Account): Promise<boolean> 
  return await http
            .post('users/', registerInfo)
            .then(res => res.data.success);

【讨论】:

属性 'resolve' 不存在于类型 '(resolver: (resolve: (val?: T | PromiseLike | undefined) => void, reject: (reason?: any) => void, notify: (progress: any) => void) => void) => Promise' 你能用这个尝试的代码更新你的问题吗?【参考方案2】:

我认为问题在于您试图返回 await 的结果,而不是捕获结果并对其进行处理:

@Action
public async register(registerInfo: Account): Promise<boolean> 
  const result = await http.post('users/', registerInfo);

  return result.data.success;

【讨论】:

【参考方案3】:

http.post方法返回Observable类型,可以使用toPromise()方法将其转换为Promise。

喜欢 - http.post.toPromise()

【讨论】:

以上是关于异步函数的返回类型必须是全局 Promise<T> 类型的主要内容,如果未能解决你的问题,请参考以下文章

异步支持返回不可链接的 Promise<void> 的函数

useState 与异步函数返回 Promise <pending>

在异步函数或 Promise 中设置全局变量的值? [复制]

为啥我的异步函数返回 Promise <pending> 而不是一个值?

异步函数返回 Promise <Pending>

怎么用promise实现异步控制