Defer Callbacks Until Load#
This guide addresses how to set up callbacks to defer a task until the application is loaded.
Using the onload
callback, we can trigger execution when a session is first initialized in a server context. An example of when this could be a helpful strategy is when we have to fetch something from some database, like the options that will go into a selection widget. Since this operation might take some time, we can quickly render something on the screen for the user to look at while the onload
callback is continuing to fetch the options in the background.
Let us for example define a minimal example inside a function which we could pass to pn.serve
(this emulates what happens when we call panel serve
on the command line). In this example, we will create a widget without populating its options, then we will add an onload
callback, which will set the options once the initial page is loaded.
import time
import panel as pn
pn.extension()
def app():
widget = pn.widgets.Select()
def on_load():
time.sleep(2) # Emulate some long running process
widget.options = ['A', 'B', 'C']
pn.state.onload(on_load)
return widget
# pn.serve(app) # launches the app
Alternatively, we may also use the defer_load
argument to wait to evaluate a function until the page is loaded. In a situation where page loading takes some time, a placeholder and the global config.loading_spinner
will be displayed.
def render_on_load():
return pn.widgets.Select(options=['A', 'B', 'C'])
pn.Row(pn.panel(render_on_load, defer_load=True))