Quantcast
Channel: Active questions tagged blazor - Stack Overflow
Viewing all articles
Browse latest Browse all 4170

How to ensure blazor executes after wasm loads?

$
0
0

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;">&nbsp;</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?


Viewing all articles
Browse latest Browse all 4170

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>