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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值