• 作者:老汪软件技巧
  • 发表时间:2024-08-27 15:02
  • 浏览量:

    function abcd(){
        console.log('A') // 假定需要 50ms
        console.log('B') // 假定需要 50ms
        console.log('C') // 假定需要 50ms
        console.log('D') // 假定需要 50ms
    }

    function a(){
        console.log("A")
    }
    setTimeout(a,250)

这段code的意思是:在250ms之后向任务队列插入一个执行a function的任务,在这个时间点之前,其他所有UI更新和javascript都可以执行,不影响响应用户操作

    function a(){
        console.log("A")
    }
    function b(){
        console.log("B")
    }
    function c(){
        console.log("C")
    }
    function d(){
        console.log("D")
    }
    setTimeout(a,250)
    setTimeout(b,250*2)
    setTimeout(c,250*3)
    setTimeout(d,250*4)

整理一下:

恭喜你,你知道了React Scheduler和React Fiber的原理_恭喜你,你知道了React Scheduler和React Fiber的原理_

    setTimeout(function(){
        a();
        setTimeout(function(){
            b()
            setTimetout(function(){
                c();
                setTimetout(function(){
                    d()
                },250)
            },250)
        },250)
    },250)

这样的代码太丑陋了,这个时候,我们需要知道一种【数组模式】,可以更简洁,把所有的任务依次放在一个数组里,依次取出来依次执行

    function a(){
        console.log("A")
    }
    function b(){
        console.log("B")
    }
    function c(){
        console.log("C")
    }
    function d(){
        console.log("D")
    }
    const tasks = [a,b,c,d]
    function execute(){
        let task = tasks.shift();
        task();
        if(tasks.length>0){
            setTimeout(execute,250)
        }
    }
    execute()

把setTimetout替换成requestIdleCallback(facebook有一个更好的实现)

    function a(){
        console.log("A")
    }
    function b(){
        console.log("B")
    }
    function c(){
        console.log("C")
    }
    function d(){
        console.log("D")
    }
    const tasks = [a,b,c,d]
    function execute(){
        let task = tasks.shift();
        task();
        if(tasks.length>0){
            requestIdleCallback(execute)
        }
    }
    execute()

恭喜你,你知道了React Scheduler和React Fiber引入的原理。React Fiber和Scheduler引入的本质原因是分割长任务,按照重要程度依次执行。