我在获取数据时应该使用setInterval吗?

时间:2017-04-05 17:45:03

标签: javascript ruby-on-rails reactjs

我正在尝试学习,然后在一个项目中使用反应。我有一个控制器(在rails中)输出json:

...
  def index
    @users = User.order(created_at: :desc)
    respond_to do |format|
      format.json { render json: @users}
    end
  end
...

一个从这个控制器获取数据的组件如下:

...
  fetchData() {
    fetch('admin/users.json', {credentials: 'same-origin'})
      .then(function(response) {
        return response.json()
      }).then(function(json) {
        this.setState({data: json})
      }.bind(this))
      .catch(function(ex) {
        console.log('parsing failed', ex)
      });
  };
...

提供此数据并不难,但允许管理员管理此数据的最佳方法是什么? 例如,我必须允许管理员删除用户。我知道如何将请求发送到服务器并删除一个用户:

...
  fetchData() {
    fetch('admin/users.json', {credentials: 'same-origin'})
      .then(function(response) {
        return response.json()
      }).then(function(json) {
        this.setState({data: json})
      }.bind(this))
      .catch(function(ex) {
        console.log('parsing failed', ex)
      });
  };

...

但是,如果有两个管理员在同一个列表或表上工作并删除用户呢?在我使用redirect_to /some/index.html做出反应之前,网站已刷新,管理员看到了数据库的当前状态。我现在正试图避免刷新整个网站,我的第一个想法是每半秒获取一次数据:

...
  tick() {
    this.fetchData()
  };

 componentDidMount() {
    setInterval(()=> this.tick(), 500)
  };
...

现在管理员每隔0.5秒向db发出一次请求并获取当前数据,但这真的是一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

这取决于数据的性质。如果您正在处理相当动态的数据,其中对您的用户来说拥有最新的事物视图非常重要,那么,建议设置websocket连接以推送所有更新的评论是个好主意。

但是,如果您正在处理经常不会改变的数据,那么它可能有点过分。您最终会遇到用户尝试删除/编辑已被删除的用户的情况吗?是的,但它很可能很少发生,可以通过发送适当的状态代码并在你的ui中处理它们来处理这些情况。