首页 > 其他分享 >【JS】并发请求调度器实现演示

【JS】并发请求调度器实现演示

时间:2023-09-09 20:44:09浏览次数:34  
标签:const runCounts JS 并发 scheduler time 演示 new order

控制多个请求的并发度,演示请求的过程和用时结果

demo:

https://scheduler-smoky.vercel.app/

github:

https://github.com/zjy4fun/scheduler

 

 

 

<script setup lang="ts">
import { ref } from 'vue'
class Scheduler{
  queue: any[]
  maxCount: number
  runCounts: number

  constructor(max = 2) {
    this.queue = []
    this.maxCount = max
    this.runCounts = 0
  }
  add(task: () => Promise<any>) {
    return new Promise<void>((resolve) => {
      const runTask = async () => {
        this.runCounts++
        await task()
        resolve()
        this.runCounts--
        const nextTask = this.queue.shift()
        if (nextTask) {
          nextTask()
        }
      }
      if (this.runCounts < this.maxCount) {
        runTask()
      } else {
        this.queue.push(runTask)
      }
    })
  }
  getRunCounts() {
    return this.runCounts
  }
}
 const timeout = (time: number) => new Promise(resolve => {
  setTimeout(resolve, time)
 })
 
 const scheduler = new Scheduler()
 const addTask = (time: number, order: string) => {
  scheduler.add(() => timeout(time)).then(
    () => {
      const current = new Date().getTime()
      orderList.value.push(order + '--' + time.toString() + 'ms')
      diffList.value.push(current - startTime)
    }
  )
 }
 
 const taskList = [
  { time: 1000, order: '1' },
  { time: 500, order: '2' },
  { time: 300, order: '3' },
  { time: 400, order: '4' },
  { time: 200, order: '5' },
  { time: 100, order: '6' },
  { time: 300, order: '7' },
  { time: 800, order: '8' },
  { time: 100, order: '9' },
  { time: 200, order: '10' },
 ]
 taskList.forEach(({ time, order }) => {
  addTask(time, order)
 })
 const startTime = new Date().getTime()


const orderList = ref<string[]>([])
const diffList = ref<number[]>([])
</script>

<template>
  <div style="width: 1000px;">
    <h1>Scheduler</h1>
    <div style="display: flex; gap: 5px; flex-direction: column; height: 200px;widows: 100%;">
        <div style="border: 1px red solid;padding: 10px;">ORDER   :{{ orderList }}</div>
        <div style="border: 1px blue solid;padding: 10px; ">TIME: {{ diffList }}</div>
        <div style="border: 1px green solid;padding: 10px; ">COUNT: {{ scheduler.getRunCounts() }}</div>
    </div>
  </div>
</template>

<style scoped>

</style>

 

标签:const,runCounts,JS,并发,scheduler,time,演示,new,order
From: https://www.cnblogs.com/zjy4fun/p/17690115.html

相关文章

  • Node.js+Express+Koa2开发接口学习笔记(一)
    http请求概述浏览器输入一个地址后,进行DNS解析(通过域名查找对应的IP地址),与server建立TCP连接(进行三次握手),发送http请求server接收到http请求,处理,并返回客户端(这里指浏览器)接收到返回数据,处理数据(如渲染页面,执行js)客户端与服务器的三次握手大致可以理解为:第一次握手:客......
  • 什么是 Angular 应用 angular.json 中的 assets 数组
    在Angular项目中,angular.json是一个非常重要的配置文件,用于定义和管理项目的各种设置和构建选项。其中,assets数组是angular.json中的一个关键配置项,用于指定需要在构建后包含在应用程序中的静态资源文件和文件夹。在本文中,我将解释什么是assets数组,并提供详细示例来说明如何使用它......
  • Android中使用GSON解析JSON数据
    Android中使用GSON解析JSON数据,以下为java代码。我这个是Unity项目打包出来的android工程,工程里自带有gson的库,所以能直接用了。publicvoidStringToJsonByGson(Stringjson){Gsongs=newGson();Model1model=gs.fromJson(json,Model1.class......
  • js json用法 转json字符串 json对象( 重点看最后)
    jsjson:JSON.parse() //转为json对象。JSON.stringify() //转为JSON字符串。举例:<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>jsjson举例</title></head><body><pid="demo"></p&g......
  • 【js】【统计次数】静态页面访问次数 js页面请求次数统计
    ​效果: 源码:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>静态页面访问量统计</title></head><body><scripttype="text/javascript">varpgcoun......
  • vue.js:响应式布局([email protected])
    一,代码:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859<template>  <divclass="hello">    <div>页......
  • 针对JavaScript混淆加密,JShaman推出新功能
    JShaman英文版在最新的一次更新时,增加了新功能:JavaScript代码混淆加密完成后,可以显示各功能耗时、处理的AST节点数量,以此可知对代码做了哪些保护处理。如上图所示,在此例中,对代码共进行了23项混淆加密,JSON数据加密8350处、字符串加密189669处、15222次平展控制流、30722处变量名修改......
  • web前端技能方法总结(css、js、jquery、html)(2)
    创建链接块display:block;列表样式在一个无序列表中,列表项的标志(marker)是出现在各列表项旁边的圆点。在有序列表中,标志可能是字母、数字或另外某种计数体系中的一个符号。要修改用于列表项的标志类型,可以使用属性list-style-type:ul{list-style-type:square;}1上面的声明把......
  • JS基础-分支语句
    分支语句是流程控制语句当中的一种可以简单理解为是一种控制条件,当达到某个条件时,执行相应的代码IFIF多条件分支例如:当变量a>b时,则执行语句块1,如果a等于b时,则执行语句块2;最后,如果a>b时,则执行语句块3ifelse语句当中的语句块一般具有排斥作用。如果执行了......
  • laravel 通过事务处理两个并发请求同时更新同一条 MySQL 数据
    在处理两个并发请求同时更新同一条MySQL数据的情况时,你需要考虑并发冲突的问题,以确保数据的一致性和完整性。以下是一些解决方法:在Laravel中,你可以使用数据库事务来处理并发更新。在事务中,你可以执行一系列操作,并在操作完成后提交或回滚事务。如果两个请求同时尝试更新相同的......