I have a table on a LV page. Each row has a button which is supposed to refresh data in a row. To refresh it, it has to send at least one request to an external API which may take a few seconds or as well as a few minutes. Data received from an external API gets saved into a DB.
I could make a user wait, but it'll be better to create a background task and return a response immediately which says something like "being updated"
Once a response has been received, how will I notify a live page about this, to then make it refresh its data?
let's say you handled the click event, triggered a background job, and updated the state of the socket with a kind of "updating..." message.
now the background job finished successfully and should notify the original liveview process. it needs to send a message to this liveview. Phoenix.PubSub well be used for this at best.
the liveview should subscribe to a topic, typically inside mount()
, the background job will be the publisher, it will broadcast a message -typically a tuple holding the updated record after being fetched- to all subscribers, the liveview process is internally a gen_server where a handle_info
callback can be implemented, in your handle_info/2
you can pattern match on that message and update you socket state accordingly.