这似乎是一件很简单的事情,但我似乎并没有找到一个简单的答案,我可以随时找到。
所以我想说我有一个像这样的Elixir函数:
def fetch_card_ids(offset, total_cards) when offset < total_cards do
url = "http://some.domanin?offset=#{offset}"
response = HTTPotion.get url
#return or yield response here
fetch_card_ids(offset+24,total_cards)
end
在C#中,我可以在迭代某些东西时产生一个返回值,当然这与递归不同但是:我可以在elixir的递归函数中做类似的事情吗?
当然,任何帮助都会受到赞赏。
答案 0 :(得分:5)
如果您想要做的是&#34; stream&#34;对呼叫者的响应,然后Stream
是一个很好的方法。例如,您可以使用Stream.unfold/2
:
def fetch_card_ids(offset, total_cards) do
Stream.unfold offset, fn
off when off < total_cards ->
resp = HTTPotion.get(url)
{resp, off + 24}
_ ->
nil
end
end
此流将&#34;产生&#34;每次提取时都会响应,并在offset
大于total_cards
时停止。
答案 1 :(得分:2)
如何以这种方式使用Streams
top = div(total_cards,24) +1 # integer division
result = Stream.map( 0..top, fn (offset) ->
url = "http://some.domanin?offset=#{24*offset}"
HTTPotion.get url
end ) |> Enum.to_list
这里Enum.to_list
只是&#34;产生&#34;最后的列表,但您也可以使用Stream.take
等