我在编写 if 语句时想做这样的事情,我的目标是首先检查将 bool 标志设置为 true 或 false 以返回的协程,然后检查内部的 bool 标志如果条件和函数将产生预期值,则相同。
我的问题是 bool 值的 if 语句中的求值是在协程结束之前还是之后。
也就是说,我有这个功能
if(myBlockingCoroutineFunction() && !myCondition) return@launch
private suspend myBlockingCoroutineFunction(): Boolean {
//some logic here
//Updates the local myCondition
myCondition = false
return true
}
我的问题是,如果阻塞 if 语句中的第一个参数,这将与
if(myBlockingCoroutineFunction()) {
if(!myCondition)
return@launch
}
据我所知,在内部,if 语句将比较参数的两个地址,以查看它们是否与谓词匹配以继续,但在这种情况下,我真的不确定 myCondition
值将在协程执行时存储,然后将其与函数的结果进行比较,但不会注意到 myCondition
已更改
最佳答案
首先,挂起函数在其名称中包含blocking
有点不合理,因为按照惯例,suspend
函数绝不能阻塞。请参阅 this article 中的暂停公约部分由 Kotlin 协同程序的设计负责人。
但是,无论该函数是挂起函数还是阻塞,代码都将同步执行,就好像这不是在协程中一样。在您的示例中,将执行 if 条件中的 myBlockingCoroutineFunction()
,并在返回后计算 bool 表达式的下一部分。
在同一个协程中,您的 myCondition
变量或属性有顺序保证,不需要同步。如果它同时从多个不同的协程修改,根据您的用例,您可能需要使用互斥来保护事件的顺序。
关于android - 协程是否在 if 条件下维持秩序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73451328/