在JavaScript中,函数总是运行到完成。这意味着如果一个函数正在运行,那么它将完全运行;只有在那之后,另一个函数才会被调用。因此,语句之间没有交错的机会(但在Java情况下是不同的)。
如果你对异步执行感到困惑,那么永远记住异步意味着稍后不是并行。所以,说到你的问题,答案是,不,你不会遇到任何问题,它将是一个完全的原子操作。
JavaScript是单线程的,所以你需要担心解锁或脏读问题。为什么JavaScript不支持多线程?
如果一个线程正在访问i
;同时另一个开始访问操作会有问题吗?
注意:这一切都适用于符合规范的标准JavaScript引擎,例如Web浏览器和Node. js中的引擎。非标准JavaScript环境,例如Java虚拟机中内置的JavaScript脚本支持,可能(当然)定义替代的非标准语义学。
Reasync
函数:async
函数不涉及多线程。但是函数的逻辑挂起在await
的事实可能会导致一些令人惊讶的行为。也就是说,它可能发生的地方被await
明确标记。
除非你有必要,否则我不会担心下面的细节。但是对于那些这样做的人…
考虑:
let a = 1;
async function one() {
return 1;
}
async function example() {
console.log(`Adding 1 to a`);
a += await one();
}
console.log(`Start, a = ${a}`);
Promise.all([
example(),
example(),
example(),
])
.then(() => {
console.log(`All done, a = ${a}`);
});