假设我有一个函数main_function
,该函数取决于其他三个函数的结果,每个函数可以返回{:ok, result}
或{:error, error}
。如何避免在JavaScript中感觉像回调地狱的嵌套嵌套case语句。
例:
def func1(input) do
case SOMECONDITION do
{:ok, result} ->
{:ok, result}
{:error, error} ->
{:error, error}
end
end
def func2(input) do
case SOMECONDITION do
{:ok, result} ->
{:ok, result}
{:error, error} ->
{:error, error}
end
end
def func3(input) do
case SOMECONDITION do
{:ok, result} ->
{:ok, result}
{:error, error} ->
{:error, error}
end
end
def main_function(input) do
case func1(input) do
{:ok, result} ->
case func2(result) do
{:ok, result} ->
case func3(result) do
{:ok, result} ->
{:ok, EXPECTED_OUTCOME}
{:error, error} ->
{:error, error}
end
{:error, error} ->
{:error, error}
end
{:error, error} ->
{:error, error}
end
end
end
只是感觉不对...
[编辑]:我已经在一个精彩的演讲中添加了一个便捷链接,涵盖了这个概念,以及下面ElixirConf 2018中针对更复杂需求的解决方案。
别担心-Elixir覆盖了您。您需要这种特殊形式:with/1
with/1
当且仅当它们与预期结果匹配时,才会继续执行功能。
您的主要功能本质上类似于:
def main_function(input) do
with {:ok, result_1} <- func1(input),
{:ok, result_2} <- func2(result_1),
...,
do: {:ok, EXPECTED_OUTCOME}
end
当找不到匹配项时,请说是因为存在像{:error, _error}
特殊格式这样的元组,它将返回遇到的第一个错误并停止执行函数。
您还可以添加其他条件。我用过的一个例子是用户可能期望某些动作需要完成许多功能,并且无论发生什么故障,我都希望向他们发出相同的警报:
def main_function(input) do
with {:ok, result_1} <- func1(input),
{:ok, result_2} <- func2(result_1),
... do
{:ok, EXPECTED_OUTCOME}
else
_error ->
{:error, "Couldn't complete action"}
end
end
这是Credo的作者关于这个概念的精彩演讲,由ElixirConf 2018提供:https : //www.youtube.com/watch?v= ycpNi701aCs & t = 473s
这是一篇很棒的帖子with/1
:https : //www.erlang-solutions.com/blog/exploring-with-the-elixir-special-form.html
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句