Hello there,
I inherited a rather complicated LiveComponent
from a colleague: due to complex JS there’s no render/1
function, only update/2
.
I have a hook which publishes an event to said component, which should then start an async operation on the backend.
@impl true
def handle_event("classify-users", _params, socket) do
socket =
socket
|> start_async(:perform_classification, fn ->
raise "Some error"
end)
{:noreply, socket}
end
I expect this code to eventually call the handle_async
callback:
@impl true
def handle_async(:perform_classification, {:exit, reason}, socket) do
Logger.error("Could not perform classification: #{reason}")
{:noreply,
push_event(socket, "classification-finished", %{class: "Error #{reason}"})}
end
However, the component simply crashes and I don’t know why it never executes said handle_async
function.
Any idea?
The following is just a guess, I’m on my phone so can’t check it out.
A live component lives in the same process of the liveview. Maybe the error can be caught on the liveview itself?
As I said this is just a guess, it could be something completely different.
thanks, but after careful investigation I came to the conclusion that it’s a layer 8 problem:
The :exit
-matching function was indeed called but not logged as the interpolation of #{reason}
raises an Exception if reason
is a tuple…
[error] Task #PID<0.12550.0> started from #PID<0.12511.0> terminating
** (RuntimeError) Some error
handle_event/3
(phoenix_live_view 0.20.17) lib/phoenix_live_view/async.ex:220: Phoenix.LiveView.Async.do_async/5
(elixir 1.18.2) lib/task/supervised.ex:101: Task.Supervised.invoke_mfa/2
Function: #Function<7.25247813/0 in Phoenix.LiveView.Async.run_async_task/5>
Args: []
[error] GenServer #PID<0.12511.0> terminating
** (Protocol.UndefinedError) protocol String.Chars not implemented for type Tuple
Got value:
{%RuntimeError{message: "Some error"},
[...]
Using "#{inspect(reason)}"
instead.
2 Likes