【问题标题】:About Promises and returning a type in TypeScript [duplicate]关于 Promises 和在 TypeScript 中返回类型 [重复]
【发布时间】: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


【解决方案1】:

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

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

也不会帮助你。你可以在 promise(而不是 Promise 构造函数)上调用 then() 来指示应在 promise 解决后执行的操作,但 this 的返回值也是一个 promise。

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

【讨论】:

  • 是的,异步代码需要异步处理。自旋循环也不起作用,因为在所有当前正在执行的函数都返回之前,javascript 不会检查是否有异步响应。 (并且根据定义,自旋循环永远不会返回)。所以你必须将你的心态转变为异步。
  • @GarrettMotzner 自旋锁可以工作,它们只需要同步轮询某些状态更改(例如 fs.readFileSync),而不是依赖异步回调来运行。它们在 JavaScript 中几乎总是一个坏主意,因为它们阻塞了整个事件循环,但它们可以被使用。
  • 我的意思是一个自旋循环,它检查内部 javascript 状态更改(例如异步回调是否更改了全局变量),而不是外部状态更改(例如文件是否已更改),但好点.
猜你喜欢
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2021-07-18
  • 2023-03-30
  • 2021-10-17
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
相关资源
最近更新 更多