因此,我向代码评审中的某个人提出了挑战,以证明他们使用异步函数的代码不会受到竞争条件的影响。为此,我提出了一些非常琐碎的代码示例来演示这个问题,值得在阅读之前先写下输出和行顺序。
let list;
async function clearList () {
list = []; // A
}
async function processList (processList) {
await clearList(); // B
list = list.concat(processList); // C
}
processList([1,2,3]); // D
processList([4,5,6]) // E
.then(() => {
console.dir(list); // F
})
因此,这里的两个问题是,这段代码的输出是什么,执行代码行的顺序是什么?现在,代码的要点是,它将显示输出是[1,2,3,4,5,6]
由于比赛条件,但实际排序的代码行我错了。
我的假设是,您不会直接输入异步方法,而是在稍后的时钟滴答中排队执行。这给了我一个执行流程D,E,B,B,A,A,C,C,F
我对此很满意,直到我的同事米伦·库奇蒂克指出我是完全错误的。
事实证明,至少在Chrome和Safari中,在到达第一个等待呼叫之前,代码不会在队列中传输。因此,实际上,当您使用调试器运行代码时,流是D,B,A,E,B,A,C,C,F
。从性能的角度来看,这是有意义的,一些异步方法可能永远不需要改变上下文,所以就在时间上异步。
总结异步方法是同步的,直到第一个等待。