【问题标题】:How to create a custom async function in Swift?如何在 Swift 中创建自定义异步函数?
【发布时间】:2022-01-19 06:58:00
【问题描述】:

在 JS 中,我可以将 promise 返回函数创建为,

function asyncFn() {
  return new Promise((resolve) => {
    // Resolve after some tasks are completed
    resolve(true)
  })
}

以后我可以做,

async function sign() {
  await asyncFn()
  console.log("asyncFn() completed")
}

或以迅捷的方式,

func sign() async {
  let _ = await asyncFn()
  print("asyncFn() completed")
}

这只是一个例子。基本上我希望完成一些任务,然后解决承诺/未来。

我如何对 Swift 做同样的事情? Swift 5.5 支持 async/await 那么有没有办法创建自己的自定义 async 或 promise 返回函数?

【问题讨论】:

  • 我不明白;超时是否代表失败案例?如果是这样,那么您需要选择一个适当的值来给任务时间来完成,然后它被认为是失败的。
  • @Paulw11 不,计时器没有失败案例。计时器只是一个例子。我只想在未知时间后解析的函数中返回 Promise/Future。
  • 所以只需使用 Swift 5.5 中新的 Async/await 即可。标记为async 的函数实际上会返回一个promise,但由于它是一流的语言功能,因此您无需将结果显式包装在promise 中。
  • 我建议观看各种 async/await WWDC 视频(例如,Meet async/await)。
  • 我怀疑您的问题的某些方面我们一定不能理解。如果是这种情况,也许您可​​以编辑您的问题以澄清。在您的问题中,您包含了 Swift async/await 示例,然后问“您如何在 Swift 中做同样的事情?”你刚刚在 Swift 中完成了,上面几行......

标签: ios swift


【解决方案1】:

推荐阅读this

func delayFetchNames() async -> [String] {
    await Task.sleep(2 * 1_000_000_000)  // Two seconds
    return ["IMG001", "IMG002"]
}
await delayFetchNames()

【讨论】:

  • 这并不可靠。我在我的问题中展示的只是一个例子。显然,在某些情况下您不知道确切的延迟量。我会更新我的问题。
  • 那你有什么问题?这个答案显然也是一个例子:延迟表示任意异步函数的调用。
猜你喜欢
  • 2019-12-29
  • 2015-11-18
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 2015-12-25
相关资源
最近更新 更多