关于承诺并在TypeScript中返回类型

时间:2019-02-18 20:22:50

标签: javascript typescript promise

这是我在Clojure编码两年后的第一周,一直以来,这是一个有趣的旅程,但是今天我发现了一个“循环”,我无法逃脱。

我有一个界面:

interface ICustomer {
  id: number,
  first_name: string
 }

我希望一个函数使用API​​,获取客户并返回接口,但据我所知,是一个“异步”函数,例如:

async consultApi( id: number ): Promise<any> {
  const customer = await SomeExternalApi.getCustomer(id);
}

将始终返回承诺。令人怀疑,我不需要承诺,我想要“ SomeExternalApi.getCustomer”方法中的类似哈希的对象,因此我需要另一个异步函数来“解决”承诺:

async getCustomer( id: number ): Promise<any> {
  const customer = await consultApi(id: number );
}

但同样,同步功能将始终返回承诺,而不是我现在渴望的客户数据。

我该如何执行以下功能:

getCustomer( id: number ): ICustomer {
  const customer = consultApi(id: number );
}

要摆脱“循环”?

我可以尝试避免使用所有“异步”功能,而编写如下内容:

return Promise.then(response => response.json)

在非异步功能中,但是我敢打赌,问题是我缺乏TS方面的专业知识。无论如何,TS开发人员如何使用“异步”功能来获取“已解决”的数据并返回已实现的接口而非承诺?

1 个答案:

答案 0 :(得分:2)

不幸的是,异步函数不可能返回承诺以外的任何东西。调用API并获取结果是异步操作,因此它需要异步操作。

return Promise.then(response => response.json)

也不会帮助您。您可以在诺言(不是then()构造函数)上调用Promise,以指示在诺言得到解决后应执行的操作,但是此操作的返回值也是诺言。

在发出API请求时,尚未发送结果,因此无法立即返回结果。