gpt4 book ai didi

swift - 在元组中保存响应时如何忽略 async let 抛出错误?

转载 作者:行者123 更新时间:2023-12-03 07:58:15 31 4
gpt4 key购买 nike

我有这样的代码:

Task {
async let configsReq = self.interactor.getConfigs()
async let optionsReq = self.interactor.getOptions()
async let updateStateReq = self.interactor.getAppUpdateState()
async let contactsReq = self.interactor.getContactOptions()

var config: Config?
var options: AvailableOptions?
var updateState: UpdateType?
var contacts: ContactOptions?

do {
config = try await configsReq
} catch {
config = nil
}

do {
options = try await optionsReq
} catch {
options = nil
}

do {
updateState = try await updateStateReq
} catch {
updateState = nil
}

do {
contacts = try await contactsReq
} catch {
contacts = nil
}

self.goToNextPage()
}

在这种情况下,请求得到正确响应或抛出错误对我来说并不重要。我不想阻止用户获得正确的响应。而且我想确保我的所有请求都得到答复(正确或错误响应)以将用户带到下一页

如何使用新的快速并发来编写更干净、更好的代码?我尝试了这样的操作(但我无法获得每个相关请求的匹配错误):

Task {
async let configs = self.interactor.getConfigs()
async let options = self.interactor.getOptions()
async let updateState = self.interactor.getAppUpdateState()
async let contacts = self.interactor.getContactOptions()

do {
let array = try await [configs, options, updateState, contacts]
} catch {
print(error)
}
}

最佳答案

如果我正确理解了这个问题,您想要:

  • “与每个相关请求匹配错误”,但是
  • 无论成功还是失败,您都希望继续进行,因为“请求得到正确响应或抛出错误对我来说并不重要”。

如果这是您正在寻找的模式,我可能建议使用Task result :

async let configsReq  = Task { try await interactor.getConfigs() }
async let optionsReq = Task { try await interactor.getOptions() }
async let stateReq = Task { try await interactor.getAppUpdateState() }
async let contactsReq = Task { try await interactor.getContactOptions() }

let config = await configsReq.result
let options = await optionsReq.result
let state = await stateReq.result
let contacts = await contactsReq.result

goToNextPage(config: config, options: options, state: state, contacts: contacts)

或者,更简洁地说:

async let configs  = Task { try await interactor.getConfigs() }
async let options = Task { try await interactor.getOptions() }
async let state = Task { try await interactor.getAppUpdateState() }
async let contacts = Task { try await interactor.getContactOptions() }

await goToNextPage(config: configs.result, options: options.result, state: state.result, contacts: contacts.result)

其中 goToNextPage 可能定义为:

func goToNextPage(
config: Result<Config, Error>,
options: Result<AvailableOptions, Error>,
state: Result<UpdateType, Error>,
contacts: Result<ContactOptions, Error>
) { … }

这样,goToNextPage 就可以查看每个内容的 .success.failure,以检索与每个内容相关的值或错误四个请求中的一个。

不用说,您还可以为这四个请求设置四个属性,然后 goToNextPage 可以引用这些属性,而不是将它们作为方法的参数。它在功能上是相同的,但是您必须决定传递给下一个方法的本地变量或更新下一个方法访问的属性。


你问:

… if we don't want to use Result anymore, how can do that?

是的,我们不再经常使用Result,因为这在历史上是传统异步模式中返回值或错误的模式,现在我们尝试一系列任务,捕获抛出的错误,但通常一旦其中一个失败就提前退出。

但是,如果您确实想捕获四个并发请求中每个请求的成功和失败,那么 Result 可以很好地封装它。

关于swift - 在元组中保存响应时如何忽略 async let 抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75369338/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com