You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

async/await方法异常:无法执行全部异步请求

异步函数requestAllAuthNetwork仅执行前两个请求的问题

我编写了名为requestAllAuthNetwork的异步函数,执行时仅完成前两个请求(getToken、validateUser),后续的createSession和getDetails请求被忽略。例如移除validateUser步骤后,createSession请求可正常执行。我尝试使用withThrowingTaskGroup方法解决,结果依旧,其他方法也未奏效。

相关代码如下:

最初的实现

func requestAllAuthNetwork(username: String, password: String) async throws {
    Task {
        let token =  try await getToken()
        let validateUser =   try await validateUser(username: username, password: password, token: token.requestToken)
        let sessionId =  try await createSession(token: token.requestToken)
        let getDetails =  try await getDetails(sessionId.sessionID)
    }
}

使用TaskGroup的尝试

func requestAllAuthNetwork(username: String, password: String) async throws {
    try await withThrowingTaskGroup(of: Void.self) { group in
        let token = try await getToken()
        let validateUser =  try await validateUser(username: username, password: password, token: token.requestToken)

        try await group.next()

        group.addTask {
            let sessionId = try await self.createSession(token: token.requestToken)
            let getDetails = try await self.getDetails(sessionId.sessionID)
        }
        try await group.waitForAll()
    }
}

问题分析与解决方案

原代码的问题

  1. 第一个版本的问题:
    函数内部嵌套了Task,会导致外层requestAllAuthNetwork直接返回,不等待内部异步操作完成。如果调用该函数的上下文没有保留Task引用或未等待其执行,后续请求可能在启动前就被系统终止。另外,内部Task抛出的错误也不会传递到外层,无法被调用者捕获。

  2. 第二个版本的问题:
    在调用group.next()时,TaskGroup中还未添加任何任务,程序会永久挂起,后续addTask代码根本无法执行。而且你的请求是顺序依赖的(createSession需要getToken的结果,getDetails需要createSession的结果),完全不需要用TaskGroup——TaskGroup适用于并行执行的任务场景。

修正后的代码

直接按顺序使用await即可,同时确保调用该函数的地方正确等待异步操作完成:

func requestAllAuthNetwork(username: String, password: String) async throws {
    let token = try await getToken()
    // 重点排查validateUser的实现:是否未正确完成异步操作、是否有未捕获的错误
    let validateUser = try await validateUser(username: username, password: password, token: token.requestToken)
    let sessionId = try await createSession(token: token.requestToken)
    let getDetails = try await getDetails(sessionId.sessionID)
}

额外排查点

既然移除validateUser后后续请求能正常执行,务必检查validateUser的实现:

  • 是否存在未正确处理的异步逻辑,导致上下文阻塞或异常?
  • 是否抛出错误但被内部吞掉,中断了后续代码执行?
  • 是否持有网络连接锁等资源未释放,影响后续请求?

内容的提问来源于stack exchange,提问作者skype skype2012

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:37:13