【问题标题】:Axios requests in a loop after previous completes先前完成后循环中的 axios 请求
【发布时间】:2020-12-17 18:51:35
【问题描述】:

我正在构建的应用程序涉及将视频帧发送到服务器进行处理。我正在使用 Axios 向服务器发送 POST 请求。我打算每秒发送大约 3-5 帧(POST 请求)。我需要在上一个请求完成后发送一个,因为下一个请求的请求正文中有数据,这取决于上一个请求的响应。

我尝试循环运行它,但不会这样做,因为下一个在前一个完成之前开始。在当前代码中,我有这样的东西-

const fun = () => {
    axios.post(url,data)
         .then((res) => {
              // process the response and modify data accordingly
              // for the next request
          })
         .finally(() => fun());
};

这样我就能够不断地实现一个又一个的请求。但我无法控制每秒发送的请求数。有什么办法可以限制每秒请求的数量最多为 5 个?

附加信息:我将它用于一个网络应用程序,我需要将网络摄像头视频帧(作为数据 URI)发送到服务器进行图像处理,然后将结果返回给客户端。我希望限制请求的数量以减少我的应用程序消耗的互联网数据,因此希望每秒最多发送 5 个请求(最好是均匀分布的)。如果 Axios POST 请求为此目的有更好的方法,请提出建议:)

【问题讨论】:

  • 只要我的 2 美分,这听起来像是使用 websockets 的一个很好的例子,如果后端支持的话。
  • 你看过瓶颈吗? npmjs.com/package/bottleneck
  • @VladimirBogomolov 我知道我可以使用 websockets。只是想知道我的方法是否有任何缺点或缺陷?我在后端使用python和flask,所以可能支持websockets
  • @Ak47 websockets 的优点是您可以在没有经常握手的情况下来回发送数据,这通常是每个 post/get 请求所必需的。打开 websocket 通道流式传输数据后,数据非常简单,后端处理 websocket 数据的成本比连续发布请求要低。

标签: javascript axios httprequest synchronous


【解决方案1】:

一个名为 Bottleneck 的神奇库可以在这里为您提供帮助。您可以使用以下代码将每秒请求数限制为您想要的任意数量:

const Bottleneck = require("bottleneck");
const axios = require('axios');
const limiter = new Bottleneck({
    maxConcurrent: 1,
    minTime: 200
});

for(let index = 0; index < 20; index++){
    limiter.schedule(() => postFrame({some: 'data'}))
        .then(result => {
            console.log('Request response:', result)
        })
        .catch(err => {
            console.log(err)
        })
}


const postFrame = data => {
    return new Promise((resolve, reject) => {
        axios.post('https://httpstat.us/200', data)
            .then(r => resolve(r.data))
            .catch(e => reject(e))
    });
}

通过操纵限制器

const limiter = new Bottleneck({
    maxConcurrent: 1,
    minTime: 200
});

您可以让您的 axios 请求以任何速率以任何并发方式触发。 例如,要将每秒请求数限制为 3,您可以将 minTime 设置为 333。按理说,如果您想将其限制为每秒 5 个,则必须将其设置为 200

请参阅此处的瓶颈文档:https://www.npmjs.com/package/bottleneck

【讨论】:

  • 谢谢...这看起来适用于我的情况。我试试看
  • 我试过这个库,但它不适用于无限循环。就我而言,我必须保持请求运行,直到客户端停止。似乎该库从一开始就将所有请求排队并停止,以便为每个请求实现 minTime。我认为如果我想让它长时间运行会很苛刻,因为所有队列都是从 start 本身开始排队的。有没有办法我可以每秒安排 5 个请求并无限循环它而不像这个库那样维护队列?
  • @Ak47 不是我的头顶。这是我会考虑的事情,但与此同时,让我指出我使用这个确切的代码使用 axios 逐行发布文件中的记录。我每秒发出 4 个请求。有些文件实际上包含数百万行,这个吸盘每次在漂亮的行人硬件上都像一个魅力。因此,如果您特别担心它最终会使用过多的资源,我认为您可能会没事。它具有漂亮的limiter.stop() 功能,可以任意杀死执行。
  • 它似乎在循环中运行多达数十万,但如果我再增加循环,它就会开始滞后。这可能意味着它正在消耗资源。虽然我的用例在循环次数少得多的情况下就足够了,但我只是想知道是否有办法处理需要无限期保持请求的情况。我会看看是否有办法实现我上面描述的。感谢您的帮助:)
  • @Ak47 非常有趣的观察。您是否在浏览器中运行您的进程?我确实否认在浏览器中使用 Bottlenck 的任何经验,因为我的东西在 Node 服务器上运行。
猜你喜欢
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2018-10-13
  • 2019-01-19
  • 2015-03-26
  • 2021-07-15
相关资源
最近更新 更多