我有 Sidekiq 作業 ( SyncProductsWorker),它會觸發一個Imports::SynchronizeProducts負責一些外部 API 呼叫的類。
module Imports
class SyncProductsWorker
include Sidekiq::Worker
sidekiq_options queue: 'imports_sync'
def perform(list)
::Imports::SynchronizeProducts.new(list).call
end
end
end
該類Imports::SynchronizeProducts給出了一系列帶有一些注釋的 monads 結果,例如
=> [Failure("999999 Product code is not valid"), Failure(" 8888889 Product code is not valid")]
我想捕捉這些結果以在 FE 上顯示它們。有可能這樣做嗎?如果我這樣做:
def perform(list)
response = ::Imports::SynchronizeProducts.new(list).call
response
end
然后在控制器內部:
def create
response = ::Imports::SyncProductsWorker.perform_async(params[:product_codes])
render json: { result: response, head: :ok }
end
結果我會有一些數字
=> "df3615e8efc56f8a062ba1c2"
uj5u.com熱心網友回復:
我不相信你想要的是可能的。
https://github.com/mperham/sidekiq/issues/3532
回傳值將像 Ruby 行程中的任何其他未使用資料一樣被 GC 處理。喬布斯在 Sidekiq 中沒有“結果”,而 Sidekiq 對價值沒有任何作用。
您將需要某種模型來跟蹤您的后臺任務。這是即興的,但應該給你一個想法。
例如
# @attr result [Array]
# @attr status [String] Values of 'Pending', 'Error', 'Complete', etc..
class BackgroundTask < ActiveRecord
attr_accessor :product_codes
after_create :enqueue
def enqueue
::Imports::SyncProductsWorker.perform_async(product_codes, self.id)
end
end
def perform(list, id)
response = ::Imports::SynchronizeProducts.new(list).call
if (response.has_errors?)
BackgroundTask.find(id).update(status: 'Error', result: response)
else
BackgroundTask.find(id).update(status: 'Complete', result: response)
end
end
然后只需將 BackgroundTask 模型用于您的前端顯示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/477392.html
