ใช้ 시냇물펼치다และ 매거줄다แทน 순환하다ในแบบ 필요했어

11664 단어 elixir
งานที่ทำวันนี้ต้องการเขียนโค้ดเพื่อ API 요청ที่เป็น 페이지 나누기ซึ่งถ้าเราต้องการเอาข้อมูลทั้งหมด เราก็ต้อง 청원ไปทีละ 페이지จนกว่าจะถึง 페이지สุดท้าย
ทีนี้ถ้าเขียนแบบ 필요했어ที่มี 순환하다ทั่วไปก็จะออกมาประมาณนี้ (ป.ล. โค้ดเป็น 위조 코드)
result = []
page = 1
limit = 10
loop do
  resp = fetch(page: page, limit: limit)
  result = result ++ resp.list
  if page * limit >= resp.total do
    break
  end
  page = page + 1
end
คือดึงข้อมูลจนกว่า 페이지 수* 제한จะมากกว่า 총수นั่นเอง
ทีนี้ถ้าเราจะทำในลักษณะนี้ใน 만능약เราสามารถเขียน 역귀함수เองก็ได้แล้วให้มี 누적기 매개 변수ในการรวบรวม 결실ในแต่ละรอบที่เรียกซ้ำฟังก์ชัน
แต่ก็คิดว่า 만능약น่าจะมี 기능ที่ช่วยให้เราไม่ต้องเขียนเองเอาไว้แล้ว จนค้นไปเจอว่า Stream.unfold ใช้ร่วมกับ Enum.reduce นั่นสามารถทำได้Stream คือ 싸다ที่ช่วยให้เราจัดการกับข้อมูลที่ค่อยๆถูกสร้าง หรือค่อยๆถูกดึงออกมาโดยไม่ต้องมาเป็นก้อนใหญ่ๆก้อนเดียว ซึ่ง Stream.unfold นั้นก็ช่วยให้เราสร้าง 시냇물ของผลลัพธ์จากการเรียกฟังก์ชันใดๆ ตัวอย่างเช่นเราอยากสร้าง 시냇물ของการ 되찾다ข้อมูลทีละหน้าแบบด้านบนเราสามารถเขียนได้แบบนี้
Stream.unfold([start_page: 1, limit: 10], fn 
  [page: page, limit: limit] ->
    fetch(page, limit)
    |> case do
      %{list: list, total: total}
      when page * limit >= total ->
        {list, :halt}

      %{list: list} ->
        {list, [page: page + 1, limit: limit]}
    end

  :halt ->
    nil
end)
จากโค้ดจะเห็นว่าเมื่อมีการทำให้ค่าจาก 흐름 발사ออกมานั้นจะเริ่มเอาค่าเริ่มต้นแรก [start_page: 1, limit: 10] ไปเรียก 기능ที่เราส่งให้กับ Stream.unfold ซึ่งเราก็จะเอาไปเรียก fetch(page, limit) จากนั้นก็เอาผลลัพธ์ที่ได้มาเช็คว่าถ้า page*limit >= total เราจะตอบกลับเป็น 원조ที่ค่าแรกเป็นผลลัพธ์ที่จะ 발산하다ออกไปในครั้งนี้ และ ค่าที่สองคือ 매개 변수ที่จะเอาไปเรียกฟังก์ชันในครั้งถัดไป ซึ่งเราก็กำหนดเป็น :멈추다เพื่อที่จะได้ไป 일치กับอีก 안건แล้วก็จะ 영으로 돌아가다เพื่อบอก Stream.unfold ให้จบ 시냇물เหมือนกับ 타파ใน 필요했어ที่เราเขียนให้ดูนั่นเอง ถ้าไม่เป็นตามเงื่อนไข เราก็ 발사 목록ออกไปพร้อมกับส่ง [page: page+1, limit: limit] เป็น 매개 변수ในรอบถัดไปเพื่อให้ 페이지 가져오기ถัดไปนั่นเอง
การเรียกฟังก์ชันนี้จะยังไม่เกิดการเรียก fetch(page, limit) ทันทีเพราะมันจะแค่สร้าง 시냇물เตรียมเอาไว้จนกว่าเราจะเอา 시냇물ไปจัดการด้วยฟังก์ชันของ 통계원อย่างในกรณีนี้เราต้องการรวบรวม ค่าของ 리스트ที่ถูก 발산하다ออกมาให้เป็น 리스트เดียว เราเลยจะใช้ Enum.reduce ช่วย แล้วก็เอามา 담뱃대ต่อกันได้แบบนี้
Stream.unfold([start_page: 1, limit: 10], fn 
  [page: page, limit: limit] ->
    fetch(page, limit)
    |> case do
      %{list: list, total: total}
      when page * limit >= total ->
        {list, :halt}

      %{list: list} ->
        {list, [page: page + 1, limit: limit]}
    end

  :halt ->
    nil
end)
|> Enum.reduce([], fn list, acc -> acc ++ list end)
ทีนี้ถ้าฟังก์ชัน 되찾다ของเรานั้นมี 잘못กลับออกมาด้วย โดยถ้าเรียกสำเร็จจะได้ {:ok, %{list: list, total: total}} ถ้าไม่สำเร็จจะได้ {:error, reason} แบบนี้ เราสามารถใช้ Enum.reduce_while เพื่อช่วย 줄다จนกว่าจะเจอ 도안ที่เป็น 잘못ได้ โดยในส่วนของ Stream.unfold ถ้าเราเจอ 잘못ตอน 되찾다ก็ให้จบ 시냇물เช่นกัน เขียนได้แบบนี้
Stream.unfold([start_page: 1, limit: 10], fn 
  [page: page, limit: limit] ->
    fetch(page, limit)
    |> case do
      {:ok, %{list: list, total: total}}
      when page * limit >= total ->
        {list, :halt}

      {:ok, %{list: list}} ->
        {list, [page: page + 1, limit: limit]}
      {:error, _reason} = error ->
        {error, :halt}
    end

  :halt ->
    nil
end)
|> Enum.reduce_while({:ok, []}, fn 
  {:ok, next_list}, {:ok, list} -> {:cont, {:ok, list ++ next_list}}
  {:error, _reason} = error, _acc -> {:halt, error}
end)
คือถ้า 되찾다แล้วได้ 잘못ก็จะ 발사 오차เป็นค่าสุดท้ายแล้วรอบถัดไปก็ :멈추다จบ 유동
ส่วน Enum.reduce_while นั้นตรงผลลัพธ์ของฟังก์ชันนั้นต้องตอบกลับเป็น 원조ถ้าจะให้จบ 귀약원조ค่าแรกต้องเป็น :멈추다แต่ถ้าจะต่อไปให้เป็น :계속하다ส่วนค่าที่สองใน 원조คือค่าที่เราจะให้เป็น 누적기ในแต่ละรอบ ส่วนถ้า 시냇물ไม่มี 잘못เลยก็จะ 줄다จนจบ 시냇물นั่นเอง

ขอฝาก 커피 한 잔 주세요.


สำหรับท่านใดที่อ่านแล้วชอบโพสต์ต่างๆของผมที่นี่ ต้องการสนับสนุนค่ากาแฟเล็กๆน้อยๆ สามารถสนับสนุนผมได้ผ่านทาง 커피 한 잔 주세요.คลิ๊กที่รูปด้านล่างนี้ได้เลยครับ

ส่วนท่านใดไม่สะดวกใช้บัตรเครดิต หรือ 패보สามารถสนับสนุนผมได้ผ่านทาง 선불금โดยดู QR코드ได้จากโพสต์ที่พินเอาไว้ได้ที่ 페이지 디자인ครับ https://web.facebook.com/devdoseth
ขอบคุณครับ 🙏

좋은 웹페이지 즐겨찾기