Wolfram Research

Function Repository Resource:

AsynchronousDynamicModule

Source Notebook

A wrapper function for dynamic modules which causes a placeholder to be shown during initialization

Contributed by: Sjoerd Smit

ResourceFunction["AsynchronousDynamicModule"][DynamicModule[, Initialization (init)]]

returns a new DynamicModule that initializes expression init asynchronously. During the initialization a spinner will be shown and the content of the DynamicModule will not evaluate before the initialization has finished.

ResourceFunction["AsynchronousDynamicModule"][DynamicModule[],placeholder]

shows placeholder during initialization.

ResourceFunction["AsynchronousDynamicModule"][DynamicModule[],placeholder,flag]

uses the variable flag to determine if the initialization has finished.

Details and Options

The SynchronousInitialization option of the original DynamicModule will be ignored. The returned DynamicModule will always have SynchronousInitialization True.
If no Initialization option is specified, ResourceFunction["AsynchronousDynamicModule"] will return the DynamicModule unchanged.

Examples

Basic Examples

The following DynamicModule shows a pink box during the initialization because the inner dynamic causes an error message:

In[1]:=
DynamicModule[{x},
 Dynamic[First[x]],
 SynchronousInitialization -> False,
 Initialization :> (
   x = {};
   Pause[3];
   AppendTo[x, 1]
   )
 ]
Out[1]=

AsynchronousDynamicModule automatically fixes this problem:

In[2]:=
ResourceFunction["AsynchronousDynamicModule"]@DynamicModule[{x},
  Dynamic[First[x]],
  SynchronousInitialization -> False,
  Initialization :> (
    x = {};
    Pause[3];
    AppendTo[x, 1]
    )
  ]
Out[2]=

Scope

The Print statement will not evaluate before the initialization finishes. All evaluation of the DynamicModule is prevented before the initialization has finished:

In[3]:=
ResourceFunction["AsynchronousDynamicModule"]@DynamicModule[{x},
  Dynamic[
   Print["Hi!"];
   First[x]
   ],
  SynchronousInitialization -> False,
  Initialization :> (
    x = {};
    Pause[3];
    AppendTo[x, 1]
    )
  ]
Out[3]=

Any placeholder can be used to show progress of the initialization:

In[4]:=
ResourceFunction["AsynchronousDynamicModule"][
 DynamicModule[{x},
  Dynamic[
   x
   ],
  SynchronousInitialization -> False,
  Initialization :> (
    x = {};
    Pause[1];
    AppendTo[x, 1];
    Pause[1];
    AppendTo[x, 2];
    Pause[1];
    AppendTo[x, 3];
    Pause[1];
    AppendTo[x, 4];
    )
  ],
 Dynamic@ProgressIndicator[Length[x], {0, 4}]
 ]
Out[4]=

Applications

You can specify a dynamically updated variable that returns the content to its initialization state. This update action can then be re-used in the content of the DynamicModule:

In[5]:=
ResourceFunction["AsynchronousDynamicModule"][
 DynamicModule[{
   x,
   start,
   updateAction
   },
  Dynamic[
   Column[{
     x,
     Slider[Dynamic[start], {0, 10, 1}],
     Button["Update",
      updateAction[start],
      Method -> "Queued",
      ImageSize -> All
      ]
     }]
   ],
  SynchronousInitialization -> False,
  Initialization :> (
    start = 0;
    updateAction[startVal_] := (
      initQ = False;
      x = {};
      Pause[1];
      AppendTo[x, startVal + 1];
      Pause[1];
      AppendTo[x, startVal + 2];
      Pause[1];
      AppendTo[x, startVal + 3];
      Pause[1];
      AppendTo[x, startVal + 4];
      initQ = True
      );
    updateAction[start]
    )
  ],
 Dynamic@ProgressIndicator[Length[x], {0, 4}],
 initQ
 ]
Out[5]=

Requirements

Wolfram Language 11.3 (March 2018) or above

Resource History

License Information