Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 使用递归更新API调用的页码_Recursion_Elixir_Agent - Fatal编程技术网

Recursion 使用递归更新API调用的页码

Recursion 使用递归更新API调用的页码,recursion,elixir,agent,Recursion,Elixir,Agent,我正在进行API调用,我使用的服务每页只返回一定数量的结果(我需要所有结果,而不仅仅是第一页)。幸运的是,他们在JSON对象上有一个名为“total_pages”的键,该键表示有多少页。还有一个“当前页面”属性。您可以在正在调用的URL的末尾添加一个寻呼机,如下所示:“example.com/endpoint&page=2” 我意识到获取所有页面的唯一方法是循环浏览总页数,并以某种方式使用新的寻呼机信息创建另一个对api的调用 这可以通过增加current_page属性使用for或while循环

我正在进行API调用,我使用的服务每页只返回一定数量的结果(我需要所有结果,而不仅仅是第一页)。幸运的是,他们在JSON对象上有一个名为“total_pages”的键,该键表示有多少页。还有一个“当前页面”属性。您可以在正在调用的URL的末尾添加一个寻呼机,如下所示:“example.com/endpoint&page=2”

我意识到获取所有页面的唯一方法是循环浏览总页数,并以某种方式使用新的寻呼机信息创建另一个对api的调用

这可以通过增加current_page属性使用for或while循环来完成,但我似乎不知道如何使用递归来完成。我已经想出了一种方法来使用代理来保存和更新当前页面状态,但这似乎是不必要的

Agent.start(fn -> 1 end, name: current_page)
Agent.update(:current_page, fn curr_page -> state + 1 end)
在Elixir中有没有办法做到这一点,可以使用cond语句检查当前页面是否=总页面,如果没有,则运行一个再次调用API的函数


谢谢

是的,一名特工为此付出了过度的代价。一个简单的递归函数可以优雅地解决这个问题。以下是一个基本的实现,可以帮助您开始:

defmodule A do
  def fetch(current_page) do
    response = get("/?page=#{current_page}")
    if response.total_pages == current_page do
      :ok
    else
      fetch(current_page + 1)
    end
  end

  # Sample function that acts like an HTTP GET request.
  def get(url) do
    IO.puts "GET #{url}"
    %{total_pages: 5}
  end
end

A.fetch(1)
输出:

GET /?page=1
GET /?page=2
GET /?page=3
GET /?page=4
GET /?page=5

我们从第一页开始。获取页面内容后,我们检查当前页面是否等于响应中的
total\u pages
。如果是这样,我们就停止,否则我们会将
current\u page
设置为
current\u page+1

顺便问一下,收集每次从请求返回的所有信息的FP方法是什么/您建议如何?我是否应该创建一个新的列表,从添加到其中的新页面获取数据,并使用类似于++的东西加入列表?(最终目标是汇编从每个页面返回的所有信息)请让我知道这是否应该是它自己的问题。谢谢,您可以通过向
fetch
添加第二个参数来跟踪这一点。最初,用
[]
调用它。然后每次调用下一页的
fetch
时,将要收集的数据添加到列表中,例如
fetch(当前页面+1,[新数据|旧数据])
。然后,返回
旧数据,而不是
:ok
,这将使函数仅返回递归结束时的数据。让我知道,如果它清除了!