0
点赞
收藏
分享

微信扫一扫

理解JavaScript异步方法的排序


因此,我向代码评审中的某个人提出了挑战,以证明他们使用异步函数的代码不会受到竞争条件的影响。为此,我提出了一些非常琐碎的代码示例来演示这个问题,值得在阅读之前先写下输出和行顺序。

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。从性能的角度来看,这是有意义的,一些异步方法可能永远不需要改变上下文,所以就在时间上异步。

总结异步方法是同步的,直到第一个等待。

举报

相关推荐

【Netty中异步的理解】

0 条评论