2

我有一个 Volt 框架任务,用于检查和存储目录上的信息,例如

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) 和 promise 调用一样抛出错误

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

在 Volt 框架文档中找不到从另一个任务调用任务的方法。

非常感谢!

4

2 回答 2

0

据我所知,任务应该在服务器端运行,然后在客户端调用,因此使用了 Promise 对象。promise 对象来自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 存储库,其中包含我对这个问题的解决方案。

于 2015-08-22T21:41:46.013 回答
0

您可以从客户端或服务器调用任务,但请记住您调用类的实例方法。(所以他们被当作单例对待)并且所有方法都返回一个 Promise。我认为你在这里的问题是你dir_contents = DirectoryHelperTask.list_contents()在课堂上做的事情。虽然您可以在 ruby​​ 中执行此操作,但我不确定您想要什么。

此外,在您执行 dir_contents = r 的位置,除非 dir_contents 在块之前定义,否则它将仅在块中定义。

于 2015-08-24T18:26:15.330 回答