javascript 异步循环是否存在可变并发问题

Can javascript have mutable concurrency problem with async loop

let mutableObject = {};
for( ...loop over wtv...) {
  const res = await someAsyncFunc();
  if(!mutable[res.someKey]) {
      mutable[res.someKey] = {}
  }
  mutable[res.someKey][res.other] = res.value;
}

res.someKey 对许多 res 很常见,问题是,是否有可能在某个时候 mutable[res.someKey] 被检测为空,实际上它正在被另一个 res 填充环形。这可能会导致重置 (mutable[res.someKey] = {}) 并跳过其他填充 res 操作。

也就是说这组事件可能吗?

=> loop1 !mutable[res.someKey] 为空 ...

=> loop2 !mutable[res.someKey] 为空,让我们重置并填充 !

=> loop1 ...,让我们重置并填充 => 我们失去了重置

的 loop2 操作

我认为它可以在下一个循环之前执行整个循环,但我有一些疑问。

我希望它足够清楚让我知道,提前致谢。

如果我没理解错的话是不可能的

JavaScript 通常是单线程的(也有例外,但您没有说明任何具体内容,所以我认为您的情况没有什么特别之处)。

在JavaScript中,所有代码都在事件内部执行。这些事件被排入事件队列。队列中的事件总是在执行队列中的下一个事件之前完全执行,因为只有一个线程可以执行它们。

使用 async-await 从代码中看起来有点困难,但原理仍然保持不变。

我总是这样看:

async-await 在 await 处将函数“切割”成多个部分,但这些部分本身总是在其他任何事情发生之前完整执行。

函数启动时,将执行以下代码,而不会被其他事件中断。

let mutableObject = {};
for( ...loop over wtv...) { // first iteration
  someAsyncFunc(); // someAsyncFunc is executed but does not "return" yet

那么第一个“事件”就因为await.

而结束了

当 someAsyncFunc() 返回的 Promise 解析时。它将继续:

  const res = // result is written from someAsyncFunc
  if(!mutable[res.someKey]) {
      mutable[res.someKey] = {}
  }
  mutable[res.someKey][res.other] = res.value;
}
for( ...loop over wtv...) { // next iteration
  someAsyncFunc();

并且这部分也不能被不同的事件打断,这意味着从 res 到下一次调用 someAsyncFunc() 之间发生的一切都是原子发生的。

因此,在此期间另一个循环无法填充 mutable[res.someKey]

进一步阅读: