实现并发请求

使用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)
  })
}
posted @ 2024-10-29 10:54  南风晚来晚相识  阅读(13)  评论(0编辑  收藏  举报