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

如何用Swift实现类似JavaScript基于Promise的async/await信号量?

以下是一段简化的JavaScript代码,实现了一个可手动解锁的信号量逻辑:

let unlockResolve = () => {}
async function semaphore() {
     await new Promise((resolve) => {
           unlockResolve = resolve
     })
}

async function stopAtTheRedLight() {
     await semaphore()
}

function unlocksSemaphore() {
     unlockResolve()
     unlockResolve  = () => {}
}

await stopAtTheRedLight()

// 其他地方:
// [...]
unlocksSempahore()

对应的基于async/await的Swift代码是什么?

对应的Swift实现

在Swift的async/await体系中,可以使用CheckedContinuation来实现类似JavaScript中手动控制Promise resolve的逻辑,以下是对应代码:

// 存储用于恢复挂起任务的continuation,可选类型避免重复调用
private var unlockContinuation: CheckedContinuation<Void, Never>?

func semaphore() async {
    await withCheckedContinuation { continuation in
        unlockContinuation = continuation
    }
}

func stopAtTheRedLight() async {
    await semaphore()
}

func unlocksSemaphore() {
    unlockContinuation?.resume()
    unlockContinuation = nil // 重置,防止重复调用导致崩溃
}

// 使用示例
Task {
    await stopAtTheRedLight()
    // 解锁后会执行这里的代码
}

// 其他地方调用解锁
// unlocksSemaphore()

代码说明

  • unlockContinuation对应JS里的unlockResolve,用来存储需要恢复的挂起任务
  • semaphore()通过withCheckedContinuation挂起当前任务,直到resume()被调用
  • stopAtTheRedLight()直接调用semaphore()实现等待逻辑
  • unlocksSemaphore()恢复挂起的任务,并重置continuation避免重复调用

注意:实际开发中如果涉及多线程访问,需要给unlockContinuation添加线程安全保护(比如用actor或者DispatchQueue同步访问),防止竞态条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:05:31