延迟作业的回调方法-render js alert
Callback method after for delayed job - render js alert
我有一个作业延迟的应用程序。我想在操作完成后(之后、成功或完成)使用回调,并通知客户端的用户。我有这样的东西:
class ScannerJob < ApplicationJob
queue_as :default
def perform(links, count = 0)
links do |url|
broadcast_it(url.to_s, count +=1)
end
after
end
def after
respond_to do |format|
format.js { render :js => "alert('Congratulations');" }
end
end
我得到了这样的东西:未终止的字符串遇到了结束。我发现这个消息来源告诉我这是不可能做到的
处理这个问题的最佳方法是什么?为什么我不能简单地调用response js?
谢谢!
是的,这是不可能的。让我们找出原因。我肯定你是如何正常的HTTP
请求周期工作的。按照传统的方式,Client
请求Server
来完成他的请求。无论是查询数据还是发送数据存储在服务器上。服务器处理客户端的请求并将响应发送给客户端。在服务器完全满足客户端的请求后,除非客户端再次请求,否则服务器将无法与客户端通信。所以基本上客户端请求服务器,服务器响应该请求并等待下一个请求。
不,让我们去处理延迟的工作。你知道我们为什么在项目中增加延迟工作。如果我们同步处理,可能会有一些性能不足或耗时的任务,这些任务会延迟用户响应。i-e
假设我想根据用户的要求分别向100人发送一封电子邮件,每封电子邮件需要5秒才能送达。因此,所有这些都需要500秒(约9分钟)才能完成。
我们不能以同步的方式进行,因为这对用户来说是一种糟糕的体验。用户请求将超时,或者即使没有超时,用户也会将其视为无响应请求并离开网站。
因此,我们将这些电子邮件发送任务作为后台处理。每当用户请求向100人发送电子邮件时,我们都会立即将回复发送给用户,并告诉他们成功的消息。我们要求延迟作业在后台处理此任务。
class MyController < ApplicationController
def process_heavy_requestion
EmailerSender.delay.send_email_in_backgroun(params) #We are delegating email sending task to delayed job. And we assume it will be done.
render text: "Email sent Successfully"
end
end
在这个操作中,我们向用户回复了一条消息。以及在后台发送电子邮件。
因此,如果我们将其映射到上面的讨论,那么服务器已经通过成功消息来响应客户端。所以,如果我们想向用户后记发送一个响应,那么这是不可能的。除非用户再次询问我们。
现在让我们来解决你的问题。
如果你想告知用户后台任务的实际进度,那么这里有一种方法。无论何时在后台执行任务,都可以在用户表/或任何其他表中设置标志。该任务的状态如何。甚至您也可以在自定义工作程序中添加另一列。
在调用后台任务之前,您需要将该列的值更改为"挂起"。在延迟工作人员中,您将相应地设置该列的值i-e(失败或完成)
所以基本上,任务输出将存储在数据库中的某个位置,甚至可以存储在用户会话中。
因此,每当用户要求处理该请求时,您都会在后台处理taks,并使用javascript添加一个脚本作为响应,该脚本将在固定时间i-e(5秒)后检查该任务的结果。因此,使用javascript,您将在每X
秒后向服务器发送请求,这是我以前任务的状态。若服务器响应已完成,则向用户显示成功消息;若失败,则向该用户显示错误消息。
我希望它能澄清你的困惑
- 在 JSX Render for React.js 中遍历 JSON 响应
- Backbone.js在填充集合后调用render
- Ember.js{{render}}助手模型设置不正确
- Ember.js使用{{render}}助手从模板中获取属性
- ruby Mustache.render没有像JS Mustache.render这样的部分的第三个参数
- 是否可以在从vanilla JS使用JSX时调用ReactDOM.render()
- Express.js res.render() and res.redirect()
- 测试Express.js res.render在承诺与Mocha&Sinon spy
- 如何在公共JS文件中使用通过Express res.render发送的JSON
- 三个 JS 导入的 OBJ 模型 [.CommandBufferContext]RENDER WARNING:渲染计数或
- Backbone.js:.render() 和 .remove() 是否应该能够相互反转
- bundle.js中的多个reactDom.render调用
- angular js render if
- splash.js中compile()、parse()和render()之间的差异
- Node.js/Express.js-如何覆盖/拦截res.render函数
- Rails 3.2+jQuery+render partial in js.erb=损坏的HTML元素
- Backbone.js render()从未调用
- 如何拦截send()或render()在Node.js express路由
- index.js:1335警告:setState(..):无法在现有状态转换期间更新(例如在' render '或其他组
- 延迟作业的回调方法-render js alert