Вызов метода задачи 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 с моим решением этой проблемы.