首页 > 解决方案 > Elixir 对 Promise 或异步等待的回调

问题描述

我在 elixir 中有一个很长的函数,它有一个如下所示的回调

def outer_fn(param) do
  doing_stuff()
  very_long_sync_function(param, fn (result) ->
    {:ok, short_fn(result)}
  end)
end

Wherevery_long_sync_function具有预期的特定返回类型outer_fn。我想知道是否有可能以类似 javascript 的 promise 样式或更好的类似 async/await 的样式来重构代码,以及它会是什么样子。

标签: promiseasync-awaitelixirsynchronous

解决方案


我无法从您的代码段中理解您到底想要实现什么,但我们有 Task.async/1Task.await/2.

沿着这些思路应该做的事情:

def outer_fn(param) do
  t = Task.async(fn ->
    very_long_sync_function(param, fn (result) ->
      {:ok, short_fn(objective_ids)}
    end)
  end)
  doing_stuff()
  Task.await(t)
end

Task.yield/2允许对等待结果进行更精细的控制。


推荐阅读