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

Swift循环中实现异步并行执行(类似JS Promise.all)

Swift 实现类似 JavaScript Promise.all 的并行异步调用

你的原代码是串行执行每个异步任务,每处理一个friend都要等待上一个createFriendResult完成。要实现并行执行,有几种常用方式:

方式1:使用 TaskGroup(推荐,灵活可控)

TaskGroup 是 Swift 并发模型中处理批量异步任务的标准方式,能同时启动所有任务并收集结果,行为和 Promise.all 一致:

let jsFriendlyFriends: [JSObject] = await withTaskGroup(of: JSObject.self) { group in
    // 为每个friend启动异步任务
    for friend in friends {
        group.addTask {
            await FriendsPlugin.createFriendResult(friend)
        }
    }
    
    // 收集所有任务的返回结果
    var results = [JSObject]()
    for await result in group {
        results.append(result)
    }
    return results
}

如果异步方法可能抛出错误,改用 withThrowingTaskGroup,它会在第一个任务抛出错误时终止所有任务,和 Promise.all 的错误行为完全对齐。

方式2:利用 Task 批量创建并行任务

如果不需要精细控制任务组,也可以直接为每个friend创建独立的Task,再等待所有任务完成:

// 批量创建并行任务
let tasks = friends.map { friend in
    Task {
        await FriendsPlugin.createFriendResult(friend)
    }
}

// 等待所有任务完成并汇总结果
let jsFriendlyFriends = await tasks.map { await $0.value }

这种写法更简洁,本质和 TaskGroup 一样,都是让所有异步任务同时执行,最后统一等待结果。

为什么原代码是串行的?

你原来的for循环中,每次调用await FriendsPlugin.createFriendResult(friend)都会暂停当前任务,直到这个异步方法完成才会进入下一次循环,因此是串行执行,无法利用并行提升效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:15:30