2015-08-17 68 views
2

我有一個Volt框架任務,用於檢查和存儲目錄上的信息,例如,從另一個任務調用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 

無法找到一個方法來調用從伏Framework文檔中的另一個任務的任務。

非常感謝!

回答

0

從我收集的內容來看,任務是在服務器端運行,然後在客戶端調用,因此使用promise對象。承諾對象來自OpalRb,所以試圖從MRI調用它不起作用。如果你有一個只能在服務器端使用的「任務」,那麼它不適合伏特的任務概念。

您的第一個解決方案的方法確實有效,但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 

Here is a GitHub repo我解決這個問題。

0

您可以從客戶端或服務器調用任務,但請記住您在類上調用實例方法。 (所以他們會像單身人士一樣對待)並且所有的方法都會返回一個Promise。我認爲你的問題在於你在課堂上做dir_contents = DirectoryHelperTask.list_contents()。雖然你可以用紅寶石做到這一點,但我不確定你想要什麼。

另外,如果你做了dir_contents = r,除非在塊之前定義了dir_contents,否則它將在塊中被定義。

+0

我認爲你完全正確 - 我應該更改代碼以更好地符合Volt的架構。 –

相關問題