【问题标题】:Rails / Ajax - Showing progress bar for long running foreground processRails / Ajax - 显示长时间运行的前台进程的进度条
【发布时间】:2014-04-02 04:33:39
【问题描述】:

我正在开发一个用户使用 twitter 登录的应用程序,在他们通过身份验证后,我们会立即处理和加载推文。这很容易需要 5-10 秒,所以我想要一个进度条,告诉他们我们已经加载了多少推文,还有多少要加载。 Hipmunk 的航班搜索就是我想要完成的一个很好的例子。

我试图通过在页面加载时启动两个 AJAX 请求来做到这一点。第一个运行与 twitter API 对话的控制器方法(长时间运行的进程),然后第二个每秒运行一个不同的控制器方法 - 理想情况下,我希望它轮询第一个请求的状态,存储在会话变量。

我在实践中看到的是第一个请求会阻塞,直到它完成,然后第二个请求开始运行。

1) 我做错了吗? AJAX 请求会阻塞吗?这是特定的轨道吗?如果是这样,我会喜欢任何解释原因的材料。
2) 如果我不能这样做,我应该使用不同的模式吗?我的想法是我可以将长时间运行的请求更改为一次只处理 200 条推文,并将状态更新到客户端,但这似乎会涉及在服务器和服务器之间来回传递大量信息客户端。

【问题讨论】:

  • 通过将主要(twitter api 重)AJAX 调用包装在 setTimeout 中,我能够获得我想要的行为。
  • 我发现这个关于“动作分块”的讨论很有帮助,因为我发现 redis/websockets 对我试图做的事情来说太过分了:groups.google.com/forum/#!topic/rubyonrails-talk/aU2nzCU3nLs

标签: jquery ruby-on-rails ajax progress-bar


【解决方案1】:

我认为模式是ok,但可以改进:


屏蔽

据我所知,Ajax 请求不会“阻塞”,因为其本质是异步的(名称 AJAX 代表 Asynchronous Javascript And XML

有各种资源(包括 this great post from CSS-tricks)解释了如何在一个页面上多次调用 AJAX,这表明这样做并不罕见

如果您在 ajax 调用中使用 sync: true 参数,这将成为问题的唯一方法。这将基本上阻止任何其他进程发生(并冻结浏览器),直到它完成


系统

我会从系统层面看待问题

您要导入大量推文? Twitter 的API is throttled,这意味着它不适合“按需”请求

这可能更适合后台作业,然后它将使用 websocket 接口、Rails 的 ActionController::Live 功能或类似功能更新您的前端:

将此模块混合到您的控制器中,以及其中的所有操作 控制器将能够在写入数据时将数据流式传输到客户端。


背景

就后端工作而言,这完全取决于您想要实现的目标。如果您可以将其拆分为可管理的块,您可能会得到controller/action call;而如果您尝试从 Twitter 导入大量数据,您最好使用Redis 作为排队系统在更长的时间(通常是几小时)内填充自己的模型

进度条

如果您能够实现 websocket 并管理您的数据收集,那么进度条会非常简单。您基本上可以将一些数据(通常是已处理的数据的数量)发送到您的 websock 正在侦听的控制器/操作;允许您使用JS在前端附加任何更新

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多