凤凰城的呈现响应在哪里?

时间:2016-10-08 10:17:15

标签: functional-programming elixir phoenix-framework

defmodule TwittEx.PageController do
  require IEx
  use TwittEx.Web, :controller

  def index(conn, _params) do
    text conn, "hello"
    "dummy string so text/2 isn't returned"
  end
end

我来自Rails,了解控制器应该做什么,但无法理解凤凰城的魔力是如何发生的。 Elixir是无状态的,因此无法修改conn_paramstext conn, "hello"如何记住“你好”,因为我没有从索引中返回它。

我怀疑还有另一个流程可以跟踪响应。如果是这样,这是否意味着单个vanilla请求具有多个进程。

1 个答案:

答案 0 :(得分:2)

  

text conn, "hello"如何记住"你好"因为我不能从索引中退回。

它没有!在您致电conn后,响应(在这种情况下为" hello")会立即写入text。您可以使用以下方法对其进行测试:

def index(conn, _params) do
  :timer.sleep(1000)
  conn = text conn, "hello"
  :timer.sleep(5000)
  conn
end

如果您访问此页面,您只需1秒钟即可看到响应,而不是6秒。

如果您尝试在text返回的新conn上致电text,则新结构会出现Plug.Conn.AlreadySentError错误state:sent。如果你尝试在同一个conn上调用它两次,那么没有错误,第二次写入被忽略。我非常确定插件处理程序有责任忽略第二次写入,因为我刚验证Plug只是再次调用处理程序send_resp。< / p>