美文网首页
用JS实现请求的串行和并行

用JS实现请求的串行和并行

作者: 熊啊熊c | 来源:发表于2021-03-19 16:29 被阅读0次

题目来源

今天看到公众号推送了一篇关于用JS实现请求的串行和并行的文章,然想自己试一下。

题目

假设现在有这么一种场景:现有 30 个异步请求需要发送,但由于某些原因,我们必须将同一时刻并发请求数量控制在 5 个以内,同时还要尽可能快速的拿到响应结果。

  • 请求的串行:按照规定的次序依次完成请求,一般用于带有依赖关系的请求
  • 请求的并行:同时执行多个异步请求,对请求先后完成的顺序没有要求
    我们平时都是基于promise来封装异步请求的,这里也主要是针对异步请求来展开。

串行的实现

假设我们的请求处在一个理想化的状态下,每次都可以在规定的时间内成功返回。

  1. 实现一个请求类,属性包括请求名,和请求所需要的时间,以及发送请求的方法(使用promise)
//请求类
class Request{
    //连个属性
    constructor(name,delay) {
        this.name = name;
        this.delay =delay
    }
  //发送请求的方法
    sendRequest(){
        let time = this.delay
        return new Promise(function (resolve, reject) {
                setTimeout(()=>resolve('status: ok '+' | runtime:'+time+'ms'),time)
        })
    }
}
//new两个请求实例
let test1 = new Request('userinfo',1000)
let test2 = new Request('productinfo',2000)
//请求的串行
test1.sendRequest().then(function (result) {
    console.log(result)
    test2.sendRequest().then(function (result) {
        console.log(result)
    })
})
//请求的串行(then中使用箭头函数简化代码)
test1.sendRequest().then((result) => {
    console.log(result)
    test2.sendRequest().then(result=>console.log(result))
})

并行请求的实现

let test1 = new Request('userinfo', 1000)
let test2 = new Request('productinfo', 2000)
let test3 = new Request('productinfo', 5000)
let container = [test1.sendRequest(),test2.sendRequest(),test3.sendRequest()]

Promise.all(container).then(
    result=> {
        console.log(result)
    }
    // console.log('end')
)

并行请求的数量限制

假如请求容器中一次产生上万条请求需要并行处理,如果同时发送请求的话有可能造成内存溢出,所以需要对请求容器进行分段处理,每次并行处理指定数量的请求,用来减少资源的消耗

  1. 首先我们需要一个函数处理并发请求,这个函数要处理一个装着许多,非依赖请求的数组,以及可以同时处理多少个请求数量的参数。
  2. 因为每次批量处理请求的数量有限制,所以我们还需要一个方法将传入的数组处理成长度较小的数组
  3. 既然每个请求都返回一个promise,所以我们用promise.all对较小数组中的请求进行一次包装,使用promise.all对请求进行处理可以使所有请求都达到resolve状态后再执行回调。
function senAll(urls=[],maxNum) {
    //如果全部请求数小于允许的最大值,直接发送全部请求
    if (urls.length<maxNum){

        return sendRequest(urls)
    }
    //对请容器进行定长裁剪处理,并进行请求完成数量的检测
    else {
        return 0
    }
// 请求的批量处理
    function sendRequest(requests=[]){
        //如果不在数组中调用请求则在调用实例的请求方法
        return Promise.all(requests).then(
            result=>{
                console.log(result)
            }
        )
    }
}

相关文章

  • 用JS实现请求的串行和并行

    题目来源 今天看到公众号推送了一篇关于用JS实现请求的串行和并行的文章,然想自己试一下。 题目 假设现在有这么一种...

  • 专题规划

    OC与JS 中数据类型 的比较 OC与JS 中多线程 的实现,异步的实现,串行与并行,队列的概念

  • 线程串行并行调度实现

    线程串行并行调度实现 问题描述 问题描述:线程A、B、C并行执行,然后和线程D串行执行,如何实现。 问题具体化:现...

  • GCD简单实现

    GCD实现1,2并行和3串行和45串行,4,5是并行。即3依赖1,2的执行,45依赖3的执行。 串行队列:队列中的...

  • 高速串行简史(二):并行通信之系统同步方式

    要了解并行信号和串行信号,我们还是来先了解下并行通信(传输)和串行通信(传输)的概念吧。并行信号就是以并行方式通信...

  • Node.js示例_串行/并行流程控制

    本文内容:用简单的示例程序描述 Node.js 串行和并行化流程控制的底层机制。实际应用开发中以社区中的工具为主。...

  • 【iOS出租屋进阶】之多线程GCD详解

    线程、任务和队列的概念 异步、同步 & 并行、串行的特点 组合 |并行队列|串行队列 |主队列----|----|...

  • 2020-06-10

    广告展示中到底是并行请求还是串行请求比较好。 并行请求是指媒体同一个广告展示机会分别向多个广告平台请求广告,通...

  • iOS 多线程技术总结

    概览 进程与线程的概念 多线程的由来 并行与并发 多线程的实现 串行与并行 线程的几种状态 串行队列与并发队列区别...

  • 2018-01-08课后总结

    今天学习了串口通信。串口通信分为串行通信和并行通信,综合串行和并行的优缺点,在工业分布中串行通信的应用更为广泛。了...

网友评论

      本文标题:用JS实现请求的串行和并行

      本文链接:https://www.haomeiwen.com/subject/rupvcltx.html