多くの非同期コードを使用する場合、適切なコードを記述する方法について混乱しています。
次のコード スニペットでは、ログインして認証 Cookie を取得し、次のリクエストでその Cookie を使用してプロジェクト名のリストを取得します (例として)。
def self.populateProjectsTable(projects_controller)
payload = {email: "email", password: "pass"}
HTTP.post("http://example.com/login", {payload: payload}) do |response|
authCookie = response.headers['Set-Cookie']
HTTP.get("http://example.com/projects.json", {cookie: authCookie}) do |response|
projects = JSON.parse(response.body.to_str)
projects_controller.projects = projects
projects_controller.reloadData
end
end
end
これは機能しますが、コードは汚れているように感じます。単一責任の原則に従っていない。これをいくつかの方法で抽出したいと思います。
def self.populateProjectsTable(projects_controller)
@taskList = TaskList.new
@taskList.doLogin
projects = @taskList.getProjects
projects_controller.projects = projects
projects_controller.reloadData
end
def doLogin
payload = {email: "email", password: "pass"}
HTTP.post("http://example.com/login", {payload: payload}) do |response|
@authCookie = response.headers['Set-Cookie']
end
end
def getProjects
HTTP.get("http://example.com/projects.json", {cookie: @authCookie}) do |response|
projects = JSON.parse(response.body.to_str)
end
end
これは明らかに機能しません。getProjects
メソッドは終了する前に呼び出され、プロジェクトはブロックのスコープ内でのみ認識され、データはメソッドdoLogin
に返されません。populateProjectsTable
最初の例で示した入れ子を使用せずに、このようなアプリケーションをどのようにプログラムするのでしょうか?