首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有setInterval的情况下“排队”所有时间运行的请求?

如何在没有setInterval的情况下“排队”所有时间运行的请求?
EN

Stack Overflow用户
提问于 2020-07-25 02:30:48
回答 1查看 119关注 0票数 1

我是通过http请求从设备上实时读取数据的,但是我现在这样做的方式是这样的:

代码语言:javascript
复制
setInterval(() => {
  for (let request of requests) {
    await request.GetData();
  }
}, 1000);

然而,有时网络中有延迟,由于有4-5个请求,有时它们不会在一秒内全部完成,所以它们开始堆叠,直到设备最终开始超时,所以我需要以某种方式摆脱setInterval。增加时间不是一种选择。

本质上,我希望它们被困在无限循环中,我可以添加一个内部计时器,让请求在上次运行后的半秒或一秒后再次运行,但我如何让它们陷入无限循环,而不会阻塞应用程序的其余部分?

或者是让setInterval在开始计算1秒间隔之前等待所有请求完成的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-25 02:34:44

尝试:

代码语言:javascript
复制
(async () => {
  while (true) {
    for (let request of requests) {
      await request.GetData();
    }

    await new Promise((resolve) => setTimeout(resolve, 1000));
  }
})();

这只会在所有请求完成后才开始等待,从而防止它们堆叠。

或者,在async函数内部,使用:

代码语言:javascript
复制
while (true) {
  await Promise.all(requests.map(request => request.GetData()));
  await new Promise((resolve) => setTimeout(resolve, 1000));
}

这是不同的,因为对request.GetData()的所有调用都将并发运行,这可能是您想要的,也可能不是。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63079524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档