ใช้ 시냇물펼치다และ 매거줄다แทน 순환하다ในแบบ 필요했어
11664 단어 elixir
ทีนี้ถ้าเขียนแบบ 필요했어ที่มี 순환하다ทั่วไปก็จะออกมาประมาณนี้ (ป.ล. โค้ดเป็น 위조 코드)
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
ขอบคุณครับ 🙏
Reference
이 문제에 관하여(ใช้ 시냇물펼치다และ 매거줄다แทน 순환하다ในแบบ 필요했어), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/iporsut/stream-unfold-enum-reduce-loop-imperative-1op0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)