V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ZehaiZhang
V2EX  ›  问与答

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

  •  
  •   ZehaiZhang · 2020-02-05 10:43:21 +08:00 · 1730 次点击
    这是一个创建于 1788 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    注意:纯 JS

    5 条回复    2020-02-05 11:40:14 +08:00
    Zenyk
        1
    Zenyk  
       2020-02-05 11:13:39 +08:00
    generate、requestanimationframe
    lovedebug
        2
    lovedebug  
       2020-02-05 11:18:58 +08:00
    生成器 + promise 可以实现
    rabbbit
        3
    rabbbit  
       2020-02-05 11:34:22 +08:00
    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  
       2020-02-05 11:36:49 +08:00 via iPhone
    Promise,Array.reduce
    rabbbit
        5
    rabbbit  
       2020-02-05 11:40:14 +08:00
    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);
    }
    })();
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1961 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:58 · PVG 08:58 · LAX 16:58 · JFK 19:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.