收藏
回答

wx.nextTick() 里的时间片如何定义?

我在页面的onPageScroll函数中调用wx.nextTick时,所有的onPageScroll的回调执行都会早于wx.nextTick,这和我的理解是不相符的。我理解时间片是eventLoop的一次宏任务,所以pageScroll事件都会创建一个宏任务,所有不应该所有的onPageScroll回调函数都早于wx.nextTick,只有当前onPageScroll回调函数的函数执行是早于内部的wx.nextTick。所以我想明确下时间片的定义。

回答关注问题邀请回答
收藏

2 个回答

  • 杨泉
    杨泉
    2023-01-28


    执行顺序是这样的:

    主线程上的同步任务是第一个宏任务,先执行主线程上的同步任务,将异步任务放入队列,宏任务放入下一个宏任务队列,微任务放入微任务队列,当主线程任务执行完成之后,就按照先进先出的原则执行所有的微任务,微任务执行完成后,开始执行下一个宏任务队列

    onpagescroll这个宏任务的执行栈没完,导致一直是nownownownow,等都万事了才轮到nexttick这些个微任务队列,所以之后才是nexttick.nexttick


    2023-01-28
    有用 1
    回复 7
    • Jiemicc
      Jiemicc
      2023-01-28
      但是pageScroll是事件,不同的pageScroll回调是在不同的宏任务中被调用的,我尝试在浏览器中模拟了操作,图片里才是预期的结果
      2023-01-28
      1
      回复
    • 杨泉
      杨泉
      2023-01-28回复Jiemicc
      错拉,settimeout是宏任务呀,。。。nexgttick是微任务,你试试在小程序里用serttimeout(wx.nexttick...., 0),保证和浏览器一个效果
      2023-01-28
      回复
    • 杨泉
      杨泉
      2023-01-28回复杨泉
      你可以在浏览器里面找个微任务放resize的回调里面,譬如promise.then,保证又和小程序里面一样了
      2023-01-28
      回复
    • 杨泉
      杨泉
      2023-01-28回复杨泉
      为什么要搞nexttick呢?无非就是把nexttick要执行的东西,搞到微任务队列里面,保证nexttick里面的东西是在主任务结束后的下一个时间片去执行,避免阻塞。如果执行效果是now,nexttick,now,nexttick,now,nexttick这样子,会卡死的。
      2023-01-28
      回复
    • Jiemicc
      Jiemicc
      2023-01-28回复杨泉
      你自己看看结果了,微任务就更得是now 和 nexttick交替打印了
      2023-01-28
      回复
    查看更多(2)
  • 泽煌在广州
    泽煌在广州
    2023-02-01

    我发现的是在小程序 Page 中,调用 setTimeout (宏任务)未设置时间,又调用 wx.nextTick ,是 setTimeout 的回调先执行了,从这点看来,wx.nextTick 不是一个微任务

    2023-02-01
    有用
    回复
登录 后发表内容