V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
TomVista
V2EX  ›  问与答

js 修改 dom,最终在队列尾部渲染,如何解决

  •  
  •   TomVista · May 22, 2019 · 1625 views
    This topic created in 2544 days ago, the information mentioned may be changed or developed.

    伪代码

    {
    	showLoading();
        doSomething();
        //在这里 loading 动画才会被渲染出来
        //closeLoading();如果有这一句,loading 动画都不会渲染.....
    }
    
    

    这个需求怎么解决,setTimeout 可以吗? 还有别的办法吗?

    我先去午睡,醒了没有答案,就打死在座的诸位.

    Supplement 1  ·  May 22, 2019
    项目不支持 es6/7,我用 settimeout 解决了.代码丑爆了.
    10 replies    2019-05-22 15:28:03 +08:00
    fishlium
        1
    fishlium  
       May 22, 2019
    我猜 doSomething 是异步的,去看看 promise 吧
    TomVista
        2
    TomVista  
    OP
       May 22, 2019
    @fishlium doSomething 不是异步,是我自己写的,但支持异步

    改成异步,用 promise 链式调用是这个意思吗?我先去试试.
    qqqz
        3
    qqqz  
       May 22, 2019
    这锅甩的,让我猝不及防
    toma77
        4
    toma77  
       May 22, 2019
    await...
    TomVista
        5
    TomVista  
    OP
       May 22, 2019
    @Phuasheng 没明白,(藏好手上的锤子,弱弱的问)
    fishlium
        6
    fishlium  
       May 22, 2019
    @TomVista 用链式调用或者 awiat 都可以
    AV1
        7
    AV1  
       May 22, 2019
    出于性能考虑,浏览器的 UI 渲染都发生在 task 结尾。
    所以,你这段代码,```showLoading()```和```closeLoading()```是在同一个 task 里的,还没来得及渲染,就随着 task 的结束而消失了。
    如果你想让```showLoading()```在```doSomething()```之前完成渲染,那你应该把```doSomething()```放在新的 task 中。
    123s
        8
    123s  
       May 22, 2019
    不知道说什么
    TomVista
        9
    TomVista  
    OP
       May 22, 2019
    @fishlium @DOLLOR ok,我去改代码

    @123s 搁半年前,我也懵逼,学呗,骚年
    TomVista
        10
    TomVista  
    OP
       May 22, 2019
    @123s 我好像理解错你的意思了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2505 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 00:29 · PVG 08:29 · LAX 17:29 · JFK 20:29
    ♥ Do have faith in what you're doing.