2017-05-01 39 views
0

我當然有一些理解遞歸的追趕。我有這個退出Elixir的遞歸函數

def query_url(id,page_number) do 
returned_response = HTTPoison.get! "https://some_web_page/#{id}/? pageNumber=#{page_number}" 
    case returned_response.status_code do 
    200 -> 
     {:ok,returned_response.body} 
    _ -> 
     {:error,:not_found} 
    end 
end 

...和

def recursive_function(id,page_number) do 
    case query_url(id,page_number) do 
    {:ok,response} -> 
     non_recusive_function(response) 
     recursive_function(id,page_number + 1) 
    {:error, :not_found} -> 
     IO.puts "Exited" 
    end 
end 

假設recursive_function(1234,1),這是我的想法是,遞歸函數將退出一次query_url/2回報{:error, :not_found},但並非如此,遞歸調用不退出。

我所要做的就是向一個特定的網址發出一個獲取請求,只要200狀態被返回並執行一些動作,並在返回非200狀態後退出。

+0

代碼看起來正確的給我。你可以嘗試'IO.inspect'每一個返回值,以確保你得到錯誤的情況下回來? – Dogbert

+0

@Dogbert,問題出在API提供者身上,無論出於何種原因,他們開始使用ERROR MESSAGE鍵返回200,他們到現在爲止返回了404。謝謝! – user1232968

+0

您可以在答案中發佈您發現的決議,並將其標記爲答案,以便其他人可以看到問題現已關閉。 –

回答

0

感謝@Dogbert,問題是與API提供者,無論出於何種原因,他們開始返回200在一個ERRORARRAY地圖,他們迄今返回404一個ERRORMESSAGE關鍵。

所以更換casecond

cond do 
    returned_response.status_code == 200 and not returned_response["ERRORARRAY"] == []) -> 
    {:ok,returned_response.body} 
    returned_response.status_code == 400 -> 
    {:error,:not_found} 

    true -> 
     {:error,:not_found} 
end