I created a new project from the new template Blazor Web AppThis file is in the BlazorProject.Client project
The code below sometimes results in this rendered html upon initial website debug:
WASM: FalseMessages:
But also occasionally renders the expected result:
WASM: TrueMessages:OnInitialized<br />OnParametersSet<br />OnAfterRenderAsync True<br />Wasm Delay in ms: 57<br />Interop.GetWelcomeMessage() Olá do Blazor! 1<br />JS Delay in ms: 59
Here is my CallJavascript3.razor test file:
@namespace AM.WebsiteBlazor.Client.Components@rendermode InteractiveAuto@using AM.WebsiteBlazor.Client.JavaScriptInterop@inject IJSRuntime jsRuntime;<div style="height:200px;"> </div>WASM: @isWASM<br />Messages:<br />@(message is not null ? (MarkupString) message: string.Empty)@code { private List<string> messages = new List<string>(); private bool isWASM = false; private bool isRendered = false; private bool jsIsExecuted = false; private string? message; private DateTime startDateTime = DateTime.Now; protected override void OnInitialized() { messages.Add("OnInitialized"); } protected override Task OnAfterRenderAsync(bool firstRender) { messages.Add($"OnAfterRenderAsync {firstRender}"); isRendered = true; StateHasChanged(); return Task.CompletedTask; } protected override void OnParametersSet() { messages.Add("OnParametersSet"); }}@{ if (isRendered && !jsIsExecuted) { while (!isWASM) { isWASM = this.jsRuntime is IJSInProcessRuntime; } messages.Add("Wasm Delay in ms: " + (DateTime.Now - startDateTime).TotalMilliseconds.ToString()); messages.Add($"Interop.GetWelcomeMessage() " + Interop.GetWelcomeMessage()); messages.Add("JS Delay in ms: " + (DateTime.Now - startDateTime).TotalMilliseconds.ToString()); message = String.Join("<br />", messages.ToArray()); jsIsExecuted = true; } }
In case you are wondering why I am using a while statement my original code was like this:
protected override void OnAfterRender(bool firstRender) { var isWebAssembly = this.jsRuntime is IJSInProcessRuntime; if (isWebAssembly) { message = Interop.GetWelcomeMessage(); } else { message = "This is not WebAssembly"; } if (firstRender) { message += " (first render)"; } StateHasChanged(); }
but similarly OnAfterRender would sporatically not be called after wasm rendered
So how do I ensure that upon the initial loading of the page after debug we get to the point where isWASM is true?