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() } }
问题分析与解决方案
原代码的问题
第一个版本的问题:
函数内部嵌套了Task,会导致外层requestAllAuthNetwork直接返回,不等待内部异步操作完成。如果调用该函数的上下文没有保留Task引用或未等待其执行,后续请求可能在启动前就被系统终止。另外,内部Task抛出的错误也不会传递到外层,无法被调用者捕获。第二个版本的问题:
在调用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
相关产品推荐
相关产品推荐

