这是我在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开发人员如何使用“异步”功能来获取“已解决”的数据并返回已实现的接口而非承诺?
答案 0 :(得分:2)
不幸的是,异步函数不可能返回承诺以外的任何东西。调用API并获取结果是异步操作,因此它需要异步操作。
return Promise.then(response => response.json)
也不会帮助您。您可以在诺言(不是then()
构造函数)上调用Promise
,以指示在诺言得到解决后应执行的操作,但是此操作的返回值也是诺言。
在发出API请求时,尚未发送结果,因此无法立即返回结果。