Elixir GenStage:返回值错误

Elixir GenStage:返回值错误,elixir,genstage,Elixir,Genstage,我正在尝试实现一个非常简单的GenStage,目的是确保我理解它,并且在开始介绍我的特定应用程序逻辑之前能够让它工作。我从制作人那里得到一个返回数据错误。我认为数据是正确的。我已经读到,返回的元组中的第二个值必须是一个列表,它看起来是一个 以下是我的GenStage实现: defmodule CoachActivity.Event.Producer do use GenStage def start_link(page) do GenStage.start_link(Coach

我正在尝试实现一个非常简单的GenStage,目的是确保我理解它,并且在开始介绍我的特定应用程序逻辑之前能够让它工作。我从制作人那里得到一个返回数据错误。我认为数据是正确的。我已经读到,返回的元组中的第二个值必须是一个列表,它看起来是一个

以下是我的GenStage实现:

defmodule CoachActivity.Event.Producer do
  use GenStage

  def start_link(page) do
    GenStage.start_link(CoachActivity.Event.Producer, page)
  end

  def init(page) do
    {:producer, page}
  end

  def handle_demand(demand, page) when demand > 0 do
    # in here we need to run the ecto query for the next X items?
    events = get_fake(page)

    IO.puts "PRODUCER: preparing to return events"
    IO.puts "PRODUCER: page will be: #{page + 1}"

    {:no_reply, events, page + 1}
  end

  defp get_fake(page) do
    IO.puts "PRODUCER: generating events for page #{page}"
    [
      "Event One",
      "Event Two",
      "Event Three",
      "Event Four",
      "Event Five"
    ]
  end
end

defmodule CoachActivity.Event.ProducerConsumer do
  use GenStage

  def start_link(page) do
    GenStage.start_link(CoachActivity.Event.ProducerConsumer, page)
  end

  def init(number) do
    {:producer_consumer, number}
  end

  def handle_events(events, _from, number) do
    # in here we will do the transformation of events
    IO.puts "PRODUCER_CONSUMER: importing a bunch of events"

    events = Enum.map(events, fn(event) ->
      CoachActivity.Event.ImportEvent.import(event)
    end)

    {:noreply, events, number}
  end
end

defmodule CoachActivity.Event.Consumer do
  use GenStage

  def start_link() do
    GenStage.start_link(CoachActivity.Event.Consumer, :ok)
  end

  def init(:ok) do
    {:consumer, :the_state_does_not_matter}
  end

  def handle_events(events, _from, state) do
    # Wait for a second.
    Process.sleep(1000)

    # Inspect the events.
    IO.inspect(events)

    # We are a consumer, so we would never emit items.
    {:noreply, [], state}
  end
end

defmodule CoachActivity.Event.ImportEvent do
  def import(event) do
    IO.puts "Converting an event: #{event}"
  end
end

defmodule KickStart do
  def start do
    {:ok, producer} = CoachActivity.Event.Producer.start_link(0)
    {:ok, producer_consumer} = CoachActivity.Event.ProducerConsumer.start_link(2)
    {:ok, consumer} = CoachActivity.Event.Consumer.start_link()

    GenStage.sync_subscribe(consumer, to: producer_consumer)
    GenStage.sync_subscribe(producer_consumer, to: producer)
  end
end
当我这样做的时候

KickStart.start
我得到以下错误消息输出:

iex(4)> KickStart.start
PRODUCER: generating events for page 0
{:ok, #Reference<0.2077982655.942931969.179180>}
PRODUCER: preparing to return events
PRODUCER: page will be: 1
iex(5)> [error] GenServer #PID<0.1066.0> terminating
** (stop) bad return value: {:no_reply, ["Event One", "Event Two", "Event Three", "Event Four", "Event Five"], 1}
Last message: {:"$gen_producer", {#PID<0.1067.0>, #Reference<0.2077982655.942931969.179180>}, {:ask, 1000}}
State: 0
** (EXIT from #PID<0.1002.0>) evaluator process exited with reason: bad return value: {:no_reply, ["Event One", "Event Two", "Event Three", "Event Four", "Event Five"], 1}
iex(4)>KickStart.start
生产者:正在为第0页生成事件
{:好的,#参考}
制片人:准备返回活动
制片人:页面将为:1
iex(5)>[错误]发电机服务器#PID终止
**(stop)错误的返回值:{:无应答,[“事件一”、“事件二”、“事件三”、“事件四”、“事件五”],1}
最后一条消息:{:“$gen_producer”,{PID,{参考},{:ask,1000}
州:0
**(退出#PID)评估程序进程退出,原因为:返回值错误:{:无应答,[“事件一”、“事件二”、“事件三”、“事件四”、“事件五”],1}

我所要做的是)理解错误消息的含义,当然还有它为什么会出现。

Typo<代码>:no_reply应该是
:noreply
.omg。就是这样。我盯着这个看了大约一个小时。提出这个作为答案,我会投票接受。非常感谢。谁投票将其作为主题关闭,而不是关于编程…胡说?不确定为什么StackOverflow没有给出确切的原因,但我投票关闭它,因为“这个问题是由一个无法再复制的问题或一个简单的印刷错误引起的。”(我觉得这是因为,
no_reply
显然是一个打字错误),没有离题。:/fair