延迟作业的回调方法-render js alert

Callback method after for delayed job - render js alert

本文关键字:-render js alert 方法 回调 作业 延迟      更新时间:2023-09-26

我有一个作业延迟的应用程序。我想在操作完成后(之后、成功或完成)使用回调,并通知客户端的用户。我有这样的东西:

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秒后向服务器发送请求,这是我以前任务的状态。若服务器响应已完成,则向用户显示成功消息;若失败,则向该用户显示错误消息。

我希望它能澄清你的困惑