在 Blazor Server 中,我可以强制异步方法在其他生命周期方法运行之前完成(即 OnInitialized)

问题描述 投票:0回答:1

我有一个 Blazor 服务器应用程序,我想在请求或刷新之间保留一些数据等。在我看来,使用 ProtectedLocalStorage 是最好的选择。我希望能够在建立连接时从 LocalStorage 获取此数据,并在该连接期间将其用于所有页面/组件。

例如,我想在 App.Razor 运行时从本地存储获取数据(据我所知,这在每个新连接开始时运行),并使该数据可用于页面组件的 OnInitialized() 方法。

类似这样的:

App.razor:

[Inject]
ProtectedLocalStorage LocalStorage {get; set;}
[Inject]
MyScopedServiceObject myScopedServiceObject {get; set;}

protected override async Task OnInitialized () {
  base.OnInitialized();
  // I know this isn't exactly right, but just to show what I want to do
  myScopedServiceObject.myData = await LocalStorage.GetAsync<string>("myDataKey").Value;
}

MyPageComponent.razor.cs

[Inject]
MyScopedServiceObject myScopedServiceObject {get; set;}

protected override void OnInitialized () {
  // I need the data here, but the async method to get it hasn't finished
  // before this runs
  string whereINeedTheData = myScopedServiceObject.myData;
}

我遇到的问题是,由于 LocalStorage.GetAsync() 方法是异步的,页面组件的 OnInitialized() 方法会在该方法完成之前运行,因此我需要的数据尚不可用。

有没有办法强制 App.razor 中启动的异步方法在我的页面组件的 OnInitialized() 方法运行之前完成?我知道我可以在页面组件的 OnInitialized() 方法中执行 GetAsync,但我宁愿有一个位置来获取数据,而不是将其编码到可能需要它的每个页面组件中。或者由于异步的工作原理,我是否会被迫这样做?

c# asp.net-core asynchronous blazor blazor-server-side
1个回答
0
投票

您可以使用方法来代替使用属性:

public class myScopedServiceObject
{

    protected readonly LocalStorage LocalStorage;
    myScopedServiceObject( LocalStorage localStorage)
    {
       LocalStorage = localStorage;
    }

    private string? CacheData;
    public async Task<string> GetData()
    {
        if (ChacheData == null) 
           CacheData = await LocalStorage.GetAsync<string>("myDataKey").Value;
        return CacheData!;
        
    }
}

MyPageComponent.razor.cs。 (现在异步)

[Inject]
MyScopedServiceObject myScopedServiceObject {get; set;}

protected override async Task OnInitializedAsync () {
  // I need the data here, but the async method to get it hasn't finished
  // before this runs
  string whereINeedTheData = await myScopedServiceObject.GetData();
}
© www.soinside.com 2019 - 2024. All rights reserved.