Вызов метода задачи Volt Framework из другой задачи

У меня есть задача Volt Framework, которая проверяет и хранит информацию в каталоге, например

class DirectoryHelperTask < Volt::Task
    def list_contents()
        contents = []
        Dir.glob("/path/to/files").each do |f|
            contents << f
        end
        return contents
    end
end

Я хотел бы назвать это из другой задачи, например

class DirectoryRearrangerTask < Volt::Task
    dir_contents = DirectoryHelperTask.list_contents()
end

Приведенный выше код (DirectoryRearranger) выдает ошибку, как и вызов обещания

DirectoryHelperTask.list_contents().then do |r|
    dir_conents = r
end.fail do |e|
    puts "Error: #{e}"
end

Не удалось найти способ вызова задачи из другой задачи в документации Volt Framework.

Большое спасибо!

2 ответа

Вы можете вызывать задачи с клиента или с сервера, но имейте в виду, что вы вызываете методы экземпляра класса. (Так что к ним относятся как к одиночкам) И все методы возвращают Обещание. Я думаю, что ваша проблема в том, что вы делаете dir_contents = DirectoryHelperTask.list_contents() внутри класса. Хотя вы можете сделать это в рубине, я не уверен, что вы хотите.

Кроме того, где вы делаете dir_contents = r, если dir_contents не был определен до блока, он будет определен только в блоке.

Исходя из того, что я понял, задачи должны выполняться на стороне сервера, а затем вызываться на стороне клиента, поэтому используется объект обещания. Объект обещания происходит из OpalRb, поэтому попытка вызвать его из MRI не сработает. Если у вас есть "задача", которая будет использоваться только на стороне сервера, то она не совсем соответствует концепции задачи Volt.

Ваш первый подход к проблеме действительно работает, за исключением того, что DirectoryRearrangerTask не может наследовать от Volt::Task,

directory_helper_task.rb

require_relative "directory_rearranger_task"

class DirectoryHelperTask < Volt::Task
  def list_contents
    contents = []
    Dir.glob("*").each do |file|
      contents << file
    end

    DirectoryRearrangerTask.rearrange(contents)

    contents
  end
end

directory_rearranger_task.rb

class DirectoryRearrangerTask
  def self.rearrange(contents)
    contents.reverse!
  end
end

Вот репозиторий GitHub с моим решением этой проблемы.

Другие вопросы по тегам