我知道我们用await等待并执行任务,而不需要用async let等待,但我不能理解这两个调用的区别:

async let resultA = myAsyncFunc()
async let resultB = await myAsyncFunc()

在我的实验中,这两个关键字的行为似乎完全相同,await关键字在这里没有任何影响,但我恐怕错过了一些东西.

事先感谢您对此的解释.🙏🏻


Update

我正在添加一个工作样例,这样您就可以看到

func myAsyncFuncA() async -> String {
    print("A start")
    try? await Task.sleep(for: .seconds(6))
    return "A"
}

func myAsyncFuncB() async -> String {
    print("B start")
    try? await Task.sleep(for: .seconds(3))
    return "B"
}

async let resultA = myAsyncFuncA()
async let resultB = await myAsyncFuncB()
print("Both have been triggered")
await print(resultA, resultB)

结果:

A start                   // Immediately
B start                   // Immediately
Both have been triggered  // Immediately
A B                       // After 6 seconds

如您所见,resultA不会阻塞上下文,并且总等待时间是最长的等待时间.

推荐答案

你问"‘async let’和‘async let aWait’的区别是什么?"什么都没有.

在这一点上,await是不必要的,通常被省略.人们可以争辩说,在async let x = await …号声明中,为避免混淆,最好省略await,因为在这一点上,它实际上并不是await.

所以,你在你的问题修改中概述的行为是正确的.

async let resultA = myAsyncFuncA()       // execution of this current task is not suspended
async let resultB = await myAsyncFuncB() // execution is also not suspended here
print("Both have been triggered")        // we can see this before the above two child tasks finish
await print(resultA, resultB)            // only here is this task suspended, awaiting those two child tasks

resultAresultB被声明为async let时,将创建各自的异步子任务,但当前任务not将被挂起(值得注意的是,尽管async let resultB = await …中有await).在这两个初始化之后,当前任务的执行继续进行到后续行,而A和B同时运行.执行实际上不会等待结果,直到您达到第四行的await,即await print(…).第二行的await位,你async let resultB = await …位,not位实际上在等待它.

SE-0317 – async let bindings中,他们说"async let的初始化式允许省略await关键字".将其描述为"许可"是轻描淡写的;我们几乎总是在初始化时省略await.

Swift相关问答推荐

为什么Swift在某些链调用中不能对不可变值使用变异成员,而在其他链调用中则不能使用变异成员?

计算Vision OS相机与Vision OS中3D模型之间的距离

启用完整并发判断以及如何解决警告

如何在SWIFT中使用DiscardingTaskGroup获得任务结果

如何在SWIFT Memory中处理对VAR数组的更新(对COW感到困惑)

如何在SwiftUI中做出适当的曲线?

可选,类似于自定义类型的初始化

将matchedGeometryEffect 应用于列表视图内的视图时,列表视图中的项目会受到影响 - SwiftUI

我如何在 swift 中的 viewdidload 之前进行委托?

如何在设备(或常量)地址空间中创建缓冲区?

如何删除快速处理消息

如何从 RC 加载场景作为 ModelEntity 而不是普通实体?

确定路径是否相交的有效方法

deinitialize() 与 deallocate()

SwiftUI 动画的范围

SwiftUI Grid 中的数组旋转

如何在 SwiftUI 的 fileImporter 中为 allowedContentTypes 设置 xcodeproj 类型?

在 Swift 中指定 UITextField 的边框半径

应用程序包不包含有效标识符

通过单击表格视图中的单元格打开新的视图控制器 - Swift iOS