Ruby on rails-如何让控制器使用ajax同时执行两个操作
Ruby on rails - How to make controller execute 2 actions simultaneously with ajax?
我在开发环境中用ajax为同一个控制器调用两个不同的操作。在一个操作中,我更新数据库的过程非常缓慢。在另一个操作中,我想让百分比结束,以更新进度条。我可以看到两者都在执行,问题是,第二个动作正在等待第一个动作完成执行,它应该每秒执行一次,以获得实际的百分比。rails可以并行执行两个操作吗?还是Webrick的问题?
我按照建议试着用美洲狮但它仍在等待第一个动作,这里的ajax代码调用
$(document).ready(function() {
$(':button').click(function(){
var formData = new FormData($('form')[0]);
$.ajax({
url: '/quotes/upload', //Server script to process data
type: 'POST',
//Ajax events
beforeSend: progress,
success: completeHandler,
error: function(ts) { alert(ts.responseText) },
// Form data
data: formData,
//Options to tell jQuery not to process data or worry about content-type.
cache: false,
contentType: false,
processData: false
});
});
});
function progress() {
$.ajax({
url: '/quotes/status.json',
dataType: "JSON"
}).success(function (percentual) {
if (percentual >= '95') {
location.reload();
} else {
var $bar = $('.bar');
$bar.width(percentual+"%");
setInterval(progress,800);
}
});
}
这是控制台打印出来的:
Started GET "/quotes/status.json" for 127.0.0.1 at 2014-09-21 10:23:38 -0300
Processing by QuotesController#status as JSON
percentual => 0 Completed 200 OK in 4ms (Views: 0.6ms | ActiveRecord: 0.0ms)
Started POST "/quotes/upload" for 127.0.0.1 at 2014-09-21 10:23:38 -0300
Processing by QuotesController#upload as */*
Parameters: {"quotes"=>#<ActionDispatch::Http::UploadedFile:0x00000001b980b0 @tempfile=#<Tempfile:/tmp/RackMultipart20140921-5849-otvxky>, @original_filename="HIST_XXX.TXT", @content_type="text/plain", @headers="Content-Disposition: form-data; name='"quotes'"; filename='"HIST_XXX.TXT'"'r'nContent-Type: text/plain'r'n">}
Rendered quotes/index.html.erb within layouts/application (0.7ms)
Completed 200 OK in 10456ms (Views: 170.3ms | ActiveRecord: 0.0ms)
Started GET "/quotes/status.json" for 127.0.0.1 at 2014-09-21 10:23:49 -0300
Processing by QuotesController#status as JSON
percentual => 100 Completed 200 OK in 3ms (Views: 0.4ms | ActiveRecord: 0.0ms)
正如我在控制台上看到的那样,它只是在上传前进行第一次调用,然后进行上传,然后在完成后进行第二次调用以进入状态
你是对的-Webrick一次只处理一个请求。也许可以试试Thin、Puma或Unicorn——它们都可以处理并发请求。
注意:请注意,使用SQLite可能会出现类似的并发问题(尤其是在涉及写入的情况下!)请切换到PostgeSQL或MySQL
使用Thin:
Gemfile
gem 'thin'
当然。。。
bundle install
然后启动服务器
thin start
使用彪马:
Gemfile
gem 'puma'
当然。。。
bundle install
启动服务器
rails s puma
使用Unicorn:
Gemfile
gem 'unicorn'
当然。。。
bundle install
启动服务器
unicorn_rails
感谢您的提示,我找到了一个解决方案:把这个放在你的development.rb文件上:
config.middleware.delete Rack::Lock
您还必须更改Webrick。对彪马来说效果不错。
相关文章:
- 单击元素两次后执行操作
- 如何在mvc3中执行操作而不更改当前页面
- jQuery onunload在按下按钮时执行操作
- 如果DOM发生更改,您将如何执行操作
- 在执行所有回调函数后执行操作
- JavaScript 对输入框执行操作
- 如何根据各种复选框状态执行操作
- 对页面重新加载 Jquery 执行操作
- jQuery如果大于则执行操作,但只执行一次
- ngStorage是否异步执行操作
- 如何逐一执行操作
- 只有当输入文本是example.com这样的域时才执行操作
- Javascript数学不起作用,更好的方式来执行操作
- Qubit在控制台中执行操作
- 停止setInterval,直到未执行操作
- 我如何使用javascript对音频标记执行操作
- JS 函数将对象作为输入,并返回一个对象,该对象对作为参数传递的对象执行操作
- 单击时执行操作多个具有相同类的 href
- 在 JavaScript 中传递指定秒数后如何执行操作
- 如何在对用户控件执行操作后调用 Web 服务