首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >for delayed - render js alert之后的回调方法

for delayed - render js alert之后的回调方法
EN

Stack Overflow用户
提问于 2016-07-25 23:51:51
回答 1查看 304关注 0票数 0

我有一个应用程序与延迟的工作。我希望在操作完成后(after、success或finish)使用回调,并通知客户端的用户。我有这样的东西:

代码语言:javascript
复制
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

我得到了类似这样的东西:未终止的字符串遇到end。我发现这个来源告诉我,这是不可能做到的。

处理这个问题的最好方法是什么?为什么我不能简单地调用respond js?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-26 02:45:36

是啊,这是不可能的。让我们找出原因。我肯定你知道正常的HTTP请求周期是如何工作的。以一种传统的方式,Client请求Server来完成他的请求。无论是查询数据还是发送数据存储在服务器上。服务器处理客户端的请求,并将响应发送给客户端。在服务器完全满足了客户端的请求后,服务器将无法与客户端通信,除非客户端再次请求/请求。因此,基本上客户端请求服务器和服务器响应该请求,并等待下一个请求。

不,让我们来处理延迟的工作吧。您知道为什么我们在项目中添加延迟作业。如果我们同步处理它们,可能会有一些需要性能或耗费时间的任务会延迟用户的响应。i-e

假设我想根据用户的请求分别发送一封电子邮件给100个人,每封电子邮件需要5秒钟才能送达。因此,需要500秒(大约9分钟)来交付所有这些内容。

我们不能以同步的方式做到这一点,因为这对用户来说是一种糟糕的体验。用户请求将超时,或者即使没有超时,用户也会将其视为无响应请求并离开站点。

因此,我们所做的是将这些电子邮件发送任务作为后台处理。每当用户请求向100个人发送电子邮件时,我们都会立即将响应发送回用户,并告诉他们成功的消息。我们让延迟的任务在后台处理这个任务。

代码语言:javascript
复制
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

在此操作中,我们向用户回复了一条消息。并在后台发送电子邮件。

因此,如果我们将其映射到上面的讨论,那么服务器已经通过成功消息响应了客户端。因此,如果我们想要向用户发送响应,那么这是不可能的。除非用户再次询问我们。

现在让我们来解决你的问题。

你想要通知用户后台任务的实际进度,那么这里有一种方法。当任务在后台执行时,您可以在用户表/或任何其他表中设置一个标志。该任务的状态是什么。甚至您也可以在您的自定义worker中添加另一列。

在调用后台任务之前,您需要将该列的值更改为“pending”。在delayed worker中,您将相应地设置该列的值i-e (失败或完成)

因此,基本上任务输出将存储在数据库中的某个位置,甚至您也可以将其存储在用户会话中。

因此,当用户请求处理请求时,您将在后台处理任务,并使用javascript添加一个脚本作为响应,该脚本将在固定时间i-e (5秒)之后检查该任务的结果。所以使用javascript,你会在每隔X秒向服务器发送一个请求,我上一个任务的状态是什么。如果服务器响应已完成,则向用户显示成功消息,如果失败,则向用户显示错误消息。

我希望它能澄清你的困惑。

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

https://stackoverflow.com/questions/38572308

复制
相关文章

相似问题

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