Saya melakukan panggilan API dan layanan yang saya gunakan hanya mengembalikan sejumlah hasil tertentu per halaman (saya membutuhkan semua hasil, bukan hanya halaman pertama). Untungnya mereka memiliki kunci pada objek JSON yang disebut "total_pages" yang mengatakan berapa banyak halaman yang ada. Ada juga atribut "current_page". Anda dapat menambahkan pager ke akhir URL yang Anda panggil seperti: "example.com/endpoint&page=2"

Saya menyadari bahwa satu-satunya cara untuk mendapatkan semua halaman adalah dengan mengulang nomor total_pages dan entah bagaimana membuat panggilan lain ke api dengan info pager baru.

Ini dapat dilakukan dengan for atau while loop dengan menambah atribut current_page tapi sepertinya saya tidak tahu bagaimana melakukannya dengan rekursi. Saya telah menemukan cara untuk melakukannya dengan Agen yang menyimpan dan memperbarui status current_page tetapi tampaknya tidak perlu.

Agent.start(fn -> 1 end, name: current_page)
Agent.update(:current_page, fn curr_page -> state + 1 end)

Apakah ada cara untuk melakukan ini di Elixir, mungkin dengan pernyataan cond yang memeriksa apakah current_page == total_pages dan jika tidak menjalankan fungsi yang memanggil API lagi?

Terima kasih

0
JAbrams 28 Oktober 2017, 04:44

1 menjawab

Jawaban Terbaik

Ya, seorang Agen terlalu berlebihan untuk ini. Fungsi rekursif sederhana dapat menyelesaikan ini dengan elegan. Berikut adalah implementasi dasar yang akan membantu Anda memulai:

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)

Keluaran:

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

Kita mulai dengan halaman 1. Setelah mengambil konten halaman, kita memeriksa apakah halaman saat ini sama dengan total_pages dalam respons. Jika ya, kita berhenti, jika tidak kita akan mengulang dengan current_page disetel ke current_page + 1.

1
Dogbert 28 Oktober 2017, 04:59
Btw apa cara FP / apa yang Anda rekomendasikan untuk mengumpulkan semua info yang datang kembali dari permintaan setiap kali? Haruskah saya membuat daftar baru yang mendapatkan data dari halaman baru yang ditambahkan ke dalamnya, dengan sesuatu seperti ++ untuk bergabung dengan daftar? (Tujuan utamanya adalah untuk mengumpulkan semua informasi yang datang kembali dari setiap halaman) Tolong beri tahu saya jika ini adalah pertanyaannya sendiri. Terima kasih
 – 
JAbrams
29 Oktober 2017, 04:43
Anda dapat melacaknya dengan menambahkan argumen kedua ke fetch. Awalnya, panggil dengan []. Kemudian setiap kali Anda memanggil fetch untuk halaman berikutnya, tambahkan data yang ingin Anda kumpulkan ke dalam daftar, mis. fetch(current_page + 1, [new_data | old_data]). Kemudian, alih-alih :ok, kembalikan old_data, yang akan membuat fungsi hanya mengembalikan data di akhir rekursi. Beri tahu saya jika itu membersihkannya!
 – 
Dogbert
29 Oktober 2017, 12:34