Главное, что здесь необходимо принять во внимание: задачи могут потерпеть неудачу.Если желаемое поведение - просто отбросить их, просто используйте пример непосредственно из примера Task.async_stream/3
и явно отбросьте их :
events
|> Task.async_stream(&expensive_func/1)
|> Enum.reduce([], fn
{:ok, event}, acc -> [event | acc]
_, acc -> acc # discard failures
end)
|> Enum.reverse()
Другой вариант будетполагаться на возвращаемое значение задачи (если оно возвращает, например, nil
в случае неудачи), то можно напрямую использовать Keyword.values/1
:
events
|> Task.async_stream(&expensive_func/1)
|> Enum.to_list()
|> Keyword.values()
FWIW, вашисходное решение вызовет MatchError
, если хотя бы одна задача не будет выполнена, поскольку ваша функция не обрабатывает :error
s.