PowerApps 建立在 JavaScript 之上,它是基于回调的单线程 (*)。每个表达式都作为一个“执行单元”执行,所以如果你有类似的东西:
UpdateContext({ a: 1, b: 2 }); UpdateContext({ c: a + b })
您可以相信“a”和“b”将一起初始化(不会被中断)。但是,您不能依赖这样一个事实,即在任何可能更改“a”或“b”值(例如计时器的 OnTimerEnd 表达式)的事情发生之前将进行第二次 UpdateContext 调用 - 尽管这种情况不太可能发生.
对于定时器的具体例子,如果你有两个用这个表达式:
Set(globalVarA, globalVarA + 1)
在调用 Set 函数的内部实现以更新其值之前,可能会为两个计时器计算“globalVarA + 1”的值(尽管不太可能,尤其是对于这种简单的操作)变量(在这种情况下,应用程序将“丢失”其中一个增量)。
当您调用数据源(涉及速度较慢的网络调用)时,更有可能发生问题。例如,如果你在两个计时器上有这个表达式:
Set(oldVar1, var1);
Patch(dataSource, record, changes);
Set(var1, oldVar1 + 1)
那么发生竞态条件的可能性就会大大增加。
希望这会有所帮助!
(*) 目前,JS 工作线程的使用非常有限,因此该应用在技术上并不是完全单线程的,但这不应该影响您编写的表达式。