【问题标题】:Swift Async Await dealing with fallback scenarioSwift Async Await 处理回退场景
【发布时间】:2023-04-10 06:21:01
【问题描述】:

我正在考虑 Async Await 功能,但我陷入了涉及提要的后备方案。在我的重构中,viewModel 尝试从网络获取提要,或者如果它失败了默认回退。

我脑子里的问题是 async await 应该消除嵌套闭包问题,但我仍然认为在后备用例中需要它。

func fetch() async throws -> [Feed]? {
    var feed: [Feed]?
    do {
        feed = try await remoteLoader.load()
    } catch {
        // Pass error up the chain for handling
        do {
          feed = try await localLoader.load()
        } catch { 
        // Pass error up the chain for handling
        }
    }
    return feed
}

这是回退的预期方法吗?

我想出的另一种方法是先尝试加载本地,然后如果成功则将其替换为远程。

func fetch() async throws -> [Feed]? {
    var feed: [Feed]?
    do {
        feed = try await localLoader.load()
        feed = try await remoteLoader.load()
    } catch {
        throw FeedRepositoryError.FetchFeed(error)
    }
    return feed
}

【问题讨论】:

    标签: swift async-await


    【解决方案1】:

    你应该要么返回一个非可选的数组,要么抛出一个错误。

    函数可以简化为

    func fetch() async throws -> [Feed] 
    {
        do {
            return try await remoteLoader.load()
        } catch {
            return try await localLoader.load()
        }
    }
    

    如果无法加载远程数据,则会捕获错误并且代码会尝试加载本地数据。如果这也失败了,则错误将移交给调用者。

    如果 remoteLoader 可以抛出多个错误,则添加第二个 catch 范围,例如如果有 unavailable 错误要回退

    func fetch() async throws -> [Feed] 
    {
        do {
            return try await remoteLoader.load()
        } catch Loader.unavailable {
            return try await localLoader.load()
        } catch {
            throw error
        }
    }
    

    如果您在第一个块中发现明显错误,您甚至可以省略第二个 catch 块。

    【讨论】:

    • 谢谢!因此,为了澄清 localLoader 和 remoteLoader 将向 viewModel 抛出任何错误,我不需要在此方法中处理它们的特定情况?
    • 不,remoteLoader 的错误在catch 块中处理。如果 remoteLoader 抛出应该传递给调用者的不同错误,则必须添加第二个 catch 分支。在这个范围内重新抛出错误。
    • 是的,这就是我正在努力解决的问题。您确实需要嵌套的“do catch”块来处理错误。
    • 请看编辑。
    • 令人惊讶的是,您忘记了,第二个 catch 块消除了混乱。将此标记为答案。谢谢+1
    猜你喜欢
    • 2020-05-24
    • 2019-10-15
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2017-06-13
    • 2018-09-03
    相关资源
    最近更新 更多