如何重构Kotlin协程代码实现图片获取且不使用Deferred
你这段代码的核心需求是并行拉取多日的图片数据,完全可以在保留并行特性的前提下大幅简化,不需要手动维护Deferred列表,也不用逐个调用await,简化后代码如下:
override suspend fun getImages(): List<Images> = coroutineScope { val today = LocalDate.now() List(numberOfImages) { i -> async { val day = today.minusDays(i.toLong()) api.getImages(day.format(DateTimeFormatter.ISO_DATE)) } }.awaitAll() }
优化点说明
- 直接用
List()构造函数替代for循环生成所有异步任务,省去可变列表的维护开销 - 调用协程标准库提供的
awaitAll()扩展方法一次性等待所有任务执行完成,全程不会显式暴露Deferred类型,符合最新的协程API使用规范 - 代码逻辑更紧凑,和原有实现的执行效率、异常传播逻辑完全一致,不会有额外副作用
如果有单请求容错的需求,只需要在async的代码块内增加try-catch捕获异常,返回默认值或者空即可,不需要修改整体结构。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

