【发布时间】:2019-02-18 20:22:50
【问题描述】:
这是我使用 Clojure 编码两年后使用 TS 的第一周,到目前为止,这是一次有趣的旅行,但今天我发现了一个我无法逃脱的“循环”。
我有一个界面:
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 开发者如何使用“异步”函数来获取“解析”的数据并返回一个已实现的接口而不是一个 Promise?
【问题讨论】:
-
你想要返回一个promise的原因是你不希望代码在等待结果时阻塞(javascript只有1个线程)并且当结果被重新调整时没有gaurentee来自异步调用。
-
通读建议的副本的答案,它应该为您清除它。
-
JavaScript 函数总是立即同步返回。如果你想让一个函数等待一些 I/O 或类似的东西,那么你希望它返回一个 Promise(或接受一个回调);唯一的替代方法是阻止事件循环和所有其他代码运行的自旋锁。所以你是正确的,你不能让函数返回除了 Promise 之外的任何东西,但是在 I/O 完成之前你会让它返回什么?
标签: javascript typescript promise