Elixir:如何避免深层嵌套的案例陈述?

奥莱·斯帕曼(Ole Spaarmann)

假设我有一个函数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

只是感觉不对...

Brofessor

[编辑]:我已经在一个精彩的演讲中添加了一个便捷链接,涵盖了这个概念,以及下面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/1https : //www.erlang-solutions.com/blog/exploring-with-the-elixir-special-form.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章