ZehaiZhang
V2EX  ›  问与答

不懂就问,纯 JS 实现延时队列

  •  
  •   ZehaiZhang · Feb 5, 2020 · 2194 views
    This topic created in 2324 days ago, the information mentioned may be changed or developed.

    一道题目,实现延时队列,结构是 value 和 time,time 表示延时时间,队列里数据顺序执行(避免并发),有知道 eventloop 每次 tick 会取出一个 promise 的特性可以实现,还有其他什么办法么?

    注意:纯 JS

    5 replies    2020-02-05 11:40:14 +08:00
    Zenyk
        1
    Zenyk  
       Feb 5, 2020
    generate、requestanimationframe
    lovedebug
        2
    lovedebug  
       Feb 5, 2020
    生成器 + promise 可以实现
    rabbbit
        3
    rabbbit  
       Feb 5, 2020
    function sleep(time) {
    return new Promise(resolve => {
    setTimeout(() => {
    resolve();
    }, time);
    });
    }

    async function queue(jobs, func) {
    console.log(jobs);
    for (let i of jobs) {
    await sleep(i.time)
    func(i.value)
    }
    }

    const jobs = [
    { value: 1, time: 1000 },
    { value: 2, time: 1000 },
    { value: 3, time: 1000 },
    { value: 4, time: 1000 },
    { value: 5, time: 1000 }
    ];
    queue(jobs, (value)=> console.log(value));
    f0rger
        4
    f0rger  
       Feb 5, 2020 via iPhone
    Promise,Array.reduce
    rabbbit
        5
    rabbbit  
       Feb 5, 2020
    function sleep(time) {
    return new Promise(resolve => {
    setTimeout(() => {
    resolve();
    }, time);
    });
    }

    async function* queue(jobs) {
    for (let i of jobs) {
    await sleep(i.time)
    yield i.value
    }
    }

    const jobs = [
    { value: 1, time: 1000 },
    { value: 2, time: 1000 },
    { value: 3, time: 1000 },
    { value: 4, time: 1000 },
    { value: 5, time: 1000 }
    ];
    (async function(){
    for await (let i of queue(jobs)) {
    console.log(i);
    }
    })();
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4122 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 04:14 · PVG 12:14 · LAX 21:14 · JFK 00:14
    ♥ Do have faith in what you're doing.