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

2020-02-05 10:43:21 +08:00
 ZehaiZhang

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

注意:纯 JS

1639 次点击
所在节点    问与答
5 条回复
Zenyk
2020-02-05 11:13:39 +08:00
generate、requestanimationframe
lovedebug
2020-02-05 11:18:58 +08:00
生成器 + promise 可以实现
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
2020-02-05 11:36:49 +08:00
Promise,Array.reduce
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);
}
})();

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/642227

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX