首页 > 其他分享 >实现并发请求

实现并发请求

时间:2024-10-29 10:50:56浏览次数:1  
标签:index const 请求 实现 express 并发 let urls

使用node实现请求的需要的接口

newList.js
// 
var express = require('express');
var router = express.Router();
// 动态路由处理  
for (let i = 1; i <= 100; i++) {  
  router.get('/file'+i, function (req, res) {
    setTimeout(() => {
      res.send({
        code: 0,
        msg: '查询成功',
        data: 'file'+i
      });
    }, Math.random()*4000);
  });
}
module.exports = router;
app.js
const express=require("express");
const path=require("path")
// 处理跨域的插件
const cors = require('cors')
//引入文章路由
const newListRouter = require('./routes/newList');
const app=express();
// 处理跨域
app.use(cors())
// 当以/public/ 开头的时候,去./public/ 目录中去找对应的资源
app.use(express.static(path.join(__dirname, '/public')));
app.use('/newList', newListRouter);

//端口
app.listen(3000,function () {
  console.log("127.0.0.1:3000")
});

前端请求

export  function concurRequest(urls, maxNum) {
  return new Promise((resolve, reject) => {
    // 处理边界情况,发送方的请求数组为0,则直接返回
    if(urls.length === 0){
      resolve([1])
      return // return的作用是让后面的代码不在继续去执行
    }
    console.log('后面的会执行了11')
    // 存储返回来的数据
    const results = []
    // 请求的下标
    let index= 0
    // 当前请求的完成数量
    let count = 0
    // 发送请求
    async function request(){
      // 处理无休止的发送请求
      if(index === urls.length){
        return
      }
      // 保存当前这个下标用来存储当前的数据、
      // 为啥要把index的值保存起来呢?
      const i = index
      console.log('results',urls[index])
      const url = urls[index]
      // 这里直接加? 应该是等待接口完成之后再加哈!
      // 在这里直接加的原因是因为:一次要请求10个,如果你放在请求完成后再加,就不是并发了
      index++
      try{
        const resp= await fetch(url)
        results[i] = resp
      }catch(err){
        results[i] = err
      }finally{
        console.log('xxxx', index, i)
        count++
        // 如果全部请求的都完成了,直接返回所有的结果
        if(count === urls.length){
          resolve(results)
        }
        // 想一下:如果前面1-10个请求,为啥没有出现造成20个请求?
        // 因为起那么那里的无休止请求处理了这个问题
        request()
      }
    }
    const times = Math.min(maxNum,urls.length)
    for(let  i=0;i<times;i++){
      request()
    }
  })
}

使用

import {concurRequest} from '@/util/util.js'
created(){
  let arrs= []
  for (let i = 1; i < 9; i++) {
    arrs.push('http://127.0.0.1:3000/newList/file' + i)
  }
  concurRequest(arrs, 10).then(res=>{
    console.log('返回来的数据concurRequest:', res)
  })
}

标签:index,const,请求,实现,express,并发,let,urls
From: https://www.cnblogs.com/IwishIcould/p/18492110

相关文章

  • SpringBoot秒杀系统实现asgyk 带论文文档1万字以上
    题目:SpringBoot秒杀系统实现asgyk进度安排:(1)2024年11月1日-2024年11月15日 确定选题,下达任务书,撰写开题报告;(2)2024年11月15日-2024年12月20日提交开题报告定稿;(3)2024年12月21日-2025年3月14日 完成选题的设计、论文大纲的撰写;(4)2025年3月15日-2025年3月21日  毕业(设......
  • Performance API 实现前端资源监控
    1.PerformanceAPI的用处PerformanceAPI 是浏览器中内置的一组工具,用于测量和记录页面加载和执行过程中的各类性能指标。它的主要用处包括:监控页面资源加载:跟踪页面中的资源(如CSS、JavaScript、图片)的加载时间。分析页面加载时间:从导航到页面完全渲染的所有时间点。衡量......
  • Springboot分布式生鲜市场信息系统设计与实现284o7
    Springboot分布式生鲜市场信息系统设计与实现284o7本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:用户,商家,商品分类,生鲜商品开题报告内容一、项目背景与意义随着生活水平的提高和消费观念的转......
  • element-ui table中使用type=‘selection‘ 实现禁用,勾选,默认选中不可修改 三种状态显
    element-uitable中使用type=‘selection’实现禁用,勾选,默认选中不可修改三种状态显示问题实现效果   需求1.status=‘CheckOk'时勾选框默认选中但不可修改勾选状态2.status=‘CheckFail'时勾选框禁用3.status=‘'时勾选框可以勾选实现思路采用el-table表格自......
  • 2048 游戏实现
    引言2048是一个非常受欢迎的数字拼图游戏,玩家通过移动方块使相同的数字合并,目标是得到2048或更高的数字。这个游戏简单而有趣,适合用来练习编程技能。代码实现1importrandom2importcurses34defget_empty_board():5return[[0]*4for_inrange(4)]67defadd_n......
  • Springboot计算机毕业设计房屋租赁管理系统的设计与实现64tm5
    Springboot计算机毕业设计房屋租赁管理系统的设计与实现64tm5本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能:房东,租户,房源类型,房源信息,预定房子,合同信息,退租信息开题报告内容一、项目背景与......
  • 如何封装一个可取消的 HTTP 请求?
    前言你可能会好奇什么样的场景会需要取消HTTP请求呢?确实在实际的项目开发中,可能会很少有这样的需求,但是不代表没有,比如:假如要实现上述这个公告栏,每点击一个tab按钮就会切换展示容器容器中的内容,但是由于这是三个tab按钮对应展示容器和信息条目结构样式都一致,于是......
  • 客户端存储 — IndexedDB 实现分页查询
    前言相信IndexedDB大家都有过了解,但是不一定每个人都有过实践,并且其中涉及到事务、游标等概念,会导致在初次使用时会有些不适应,那么本文会通过IndexedDB实现分页查询的形式进行实践,在开始之前,可以尝试思考一下浏览器的客户端存储你都了解哪些呢?其实客户端存储分为下面......
  • 抖音中aBogus签名算法的纯Python代码实现(2024年10月)
    目前网上的aBogus签名算法都是用python里execjs来执行js代码计算的,这种方法虽然可以达到计算签名值的结果,但是性能不高。本文直接将aBogus的js的源码改成python代码,同样的参数,计算的结果和js版本一样。附python源码importjsonfromrandomimportchoicefromrandomimport......
  • rust+tikio实现websocket
    toml[dependencies]libc="0.2.98"tokio={version="1.8.1",features=["sync","time","rt-multi-thread","macros"]}tokio-tungstenite="0.15.0"tungstenite="0.14.0"futu......