首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在获取数据时在setInterval()中使用componentDidMount的一种更有利于性能的方法

在获取数据时在setInterval()中使用componentDidMount的一种更有利于性能的方法
EN

Stack Overflow用户
提问于 2019-11-13 21:05:12
回答 1查看 678关注 0票数 1

我在这里为找到正确的解决办法而努力奋斗。目前,我正在使用setInterval()“轮询”我的服务器并检索一个对象数组。为了获取数据,我使用axios。以下是相关的功能:

代码语言:javascript
复制
  componentDidMount(){
    this.timer = setInterval(() => [this.getData(), this.getCustData()], 1000);
  }

  componentWillUnmount(){
    this.timer && clearInterval(this.timer);
    this.timer = false
  }

  getData = () => {
      axios.get('http://localhost:3001/api/v1/pickup_deliveries')
        .then((response) => {
            this.setState({
              apiData: response.data
            })
          })
        .catch((error)=>{console.log(error);});
  }

    getCustData = () => {
      axios.get('http://localhost:3001/api/v1/customers')
        .then((response) => {
            this.setState({
              custData: response.data
            })
          })
        .catch((error)=>{console.log(error);});
  }

应用程序运行速度太慢,而且经常会挂起服务器,从而使整个应用程序无法使用。目前,它正在获取的数组已经覆盖了1000+对象,而且这个数量每天都在增加。如果我在不轮询服务器的情况下获取数据,我的应用程序的感觉就是日日夜夜。我不太清楚答案是什么,但我知道我所做的不是正确的方法。

这就是用setInterval()来嘲弄“轮询”的本质吗?或者,是否有一种方法只在state更改时获取数据?

如果我需要实现SSE或WebSockets,我将经历一些麻烦,但我想看看是否有一种方法可以修复我当前的代码以获得更好的性能。

谢谢你听我说完。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-14 01:34:35

在前端,我的建议是不要使用setInterval,而是使用setTimeout。

使用setInterval,您的应用程序可能会发送另一个请求,即使之前请求的响应尚未恢复(例如:需要超过1秒)。最好,您应该只在收到前一个响应后1秒发送另一个请求。

代码语言:javascript
复制
componentDidMount() {
  getData();
}

getData = () => {
  fetch().then(() => {
    updateState();

    // schedule next request
    setTimeout(getData, 1000);
  });
}

您还应该尝试减少需要在前端进行的更新的数量,例如通过减少数据的数量。

但是,我认为最重要的是重新考虑应用程序的设计。轮询只会变得更大的大型JSON不是一个可伸缩的设计。这对服务器和客户端都不利。

如果您要做的是将服务器端的任何更改通知客户端,则应该查看WebSocket。一个简单的想法是浏览器应该建立到服务器的WS连接。在对服务器进行任何更新时,服务器不应该发送整个数据,而应该只向客户端发送更新。然后,客户端将更新自己的状态。

例如,假设有两个用户正在打开相同的页面,一个用户通过添加一个新的产品进行更改。服务器将收到此请求并相应地更新数据库。它还将向所有打开的WebSocket连接(添加产品的一个连接除外)广播一条消息,其中包含如下所示的简单对象:

代码语言:javascript
复制
{
  "action": "INSERT",
  "payload": {
    "product": {
      "id": 123123,
      ... // other product data
    }
  }
}

其他用户将使用此数据更新自己的状态,以便与服务器匹配。

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

https://stackoverflow.com/questions/58845584

复制
相关文章

相似问题

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