首页 > 其他分享 >JS实现一个带并发限制的异步调度器Scheduler, 保证同时运行的任务最多有两个。

JS实现一个带并发限制的异步调度器Scheduler, 保证同时运行的任务最多有两个。

时间:2023-03-17 14:56:48浏览次数:40  
标签:count 异步 task run addTask JS resolve Scheduler

// JS实现一个带并发限制的异步调度器Scheduler,
// 保证同时运行的任务最多有两个。
// 完善代码中Scheduler类,
// 使得以下程序能正确输出

class Scheduler {
	constructor() {
		this.count = 2
		this.queue = []
		this.run = []
	}

	add(task) {
                 // ...
	}
}


const timeout = (time) => new Promise(resolve => {
	setTimeout(resolve, time)
})

const scheduler = new Scheduler()
const addTask = (time, order) => {
	scheduler.add(() => timeout(time)).then(() => console.log(order))
}

addTask(1000, '1')
addTask(500, '2')
addTask(300, '3')
addTask(400, '4')
// output: 2 3 1 4

// 一开始,1、2两个任务进入队列
// 500ms时,2完成,输出2,任务3进队
// 800ms时,3完成,输出3,任务4进队
// 1000ms时,1完成,输出1
// 1200ms时,4完成,输出4

代码

class Scheduler {
            constructor(count) {
                this.count = count;
                this.queue = [];
                this.run = [];
            }

            add(task) {
                return new Promise((resolve, reject) => {
                    this.queue.push({ task, resolve, reject });
                    if (this.run.length < this.count) {
                        this._runTask();
                    }
                });
            }

            _runTask() {
                const { task, resolve, reject } = this.queue.shift();
                this.run.push(task);
                task().then((result) => {
                    resolve(result);
                }, (error) => {
                    reject(error);
                })
                .finally(() => {
                    this.run.splice(this.run.indexOf(task), 1);
                    if (this.queue.length > 0) {
                        this._runTask();
                    }
                });
            }
        }

标签:count,异步,task,run,addTask,JS,resolve,Scheduler
From: https://www.cnblogs.com/pangqianjin/p/17226780.html

相关文章

  • 获取jsonArray的属性值
     如果对方传的 json是jsonArray格式的json可以采用下面的方式进行获取里面的参数值例如:msgId就是里面的属性publicBooleantestSyncStatus(Stringjson){J......
  • js 合并单元格
    1.基于数据规则,设置好哪些是需要合并的。https://blog.csdn.net/m0_60504233/article/details/125187202?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.......
  • Cesium 与 Babylon.js 可视化 glsl 特效篇(四十三)
    我决定不从Babylonjs基础来讲了直接整合cesium与babylonjs可视化来讲我整合一个类库后续不断更新中npmi@haibalai/cesium-babylonjs 初始化cesium-babylonjs......
  • js中 数组和Object的keys(),values()和entries()方法
    ES6提供三个新的方法——entries(),keys()和values()。它们都返回一个遍历器对象,可以用for…of循环进行遍历,区别是keys()是对键名的遍历、values()是对键值的遍历,entrie......
  • js中的promise详解【转载】
    一、概述Promise是异步编程的一种解决方案,可以替代传统的解决方案--回调函数和事件。ES6统一了用法,并原生提供了Promise对象。作为对象,Promise有以下两个特点:(1)对......
  • JS+CSS 轮播通知效果
    使用JS+CSS实现一个简单的轮播通知效果图html<div><ulid="notification"><li>通知1</li><li>通知2</li><li>通知3</li><li>通知4</li......
  • 将一个普通方法改写为异步方法
    如何将一个普通方法改写成异步方法? ///<summary>///把一个普通无参,无返回值的方法转为异步方法///</summary>///<paramname="srcAct......
  • .net 6 增删改查、 异步事务
    .net6增删改查、异步事务usingAutoMapper;usingAutoMapper.QueryableExtensions;usingMicrosoft.EntityFrameworkCore;usingSystem;usingSystem.Collections......
  • rxjs学习
    基本概念Observable(可观察对象):表示一个概念,这个概念是一个可调用的未来值或事件的集合。相当于Promise对象,内部可以用于执行异步代码,通过调用内部提供的方法将异步代......
  • vue3 js 学习笔记
    Vue3-js学习笔记目录Vue3-js学习笔记目录前言reactive数据绑定事件绑定生命函数周期计算属性-computedpropsemit-自定义事件ref-获取元素及子组件watchvu......