如何在PromiseKit循环中使用when函数批量获取Azure Blob文件
嘿,很高兴看到你已经用DispatchGroup搞定了问题!不过既然你最初想使用PromiseKit来实现,我来给你优化一下对应的方案,让代码更贴合Promise的链式风格,也能更优雅地处理批量异步操作~
首先先说说你之前尝试的PromiseKit代码里的小问题:
- 你用
(0..<count)来遍历索引,这会漏掉最后一个预约ID(因为..<是左闭右开区间),应该直接遍历appointmentIds数组本身 - 外层不需要额外包裹一个
Promise,when(fulfilled:)本身就会返回一个Promise,我们可以直接基于它做后续处理
下面是优化后的PromiseKit实现:
func getBlobsForAllJobs(appointmentIds: [Int32]) -> Promise<[BlobDownload]> { // 为每个预约ID创建对应的获取Blob的Promise let promises = appointmentIds.map { appointmentId in getBlobsPromise(appointmentId: appointmentId) } // 等待所有Promise成功完成,然后将二维数组扁平化为一维数组 return when(fulfilled: promises).map { allBlobArrays in // 把每个Promise返回的[BlobDownload]合并成一个大数组 allBlobArrays.flatMap { $0 } } }
代码说明:
- 批量创建Promise:用
appointmentIds.map直接为每个ID生成对应的getBlobsPromise,避免索引操作带来的错误 - 等待所有异步任务完成:
when(fulfilled: promises)会等待所有子Promise都成功执行,才会进入后续的map环节;如果任何一个子Promise失败,整个流程会直接进入错误处理 - 合并结果:
when返回的是[[BlobDownload]](每个子Promise对应一个数组),我们用flatMap把它转换成单一的[BlobDownload]数组,方便后续统一处理
使用示例:
// 调用这个方法,处理最终结果或错误 getBlobsForAllJobs(appointmentIds: yourAppointmentList) .done { allBlobs in // 所有Blob都成功获取完成,在这里执行后续逻辑 print("成功获取到 \(allBlobs.count) 个预约照片") // 比如开始下载这些Blob... } .catch { error in // 处理任何一个请求失败的情况 print("获取Blob列表失败:\(error.localizedDescription)") }
另外提个小细节:你在getBlobsPromise里创建BlobDownload的时候用了Int(jobId),这里看起来像是笔误,应该用传入的appointmentId才对哦~
对比你用DispatchGroup的实现,PromiseKit的方式优势在于:
- 代码更简洁,链式调用的可读性更强
- 错误处理更集中,不需要手动在每个回调里处理错误
- 不需要手动管理
enter()和leave(),减少了人为出错的概率
内容的提问来源于stack exchange,提问作者Energy CJ
相关产品推荐
相关产品推荐

