我有一个 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,但我宁愿有一个位置来获取数据,而不是将其编码到可能需要它的每个页面组件中。或者由于异步的工作原理,我是否会被迫这样做?
您可以使用方法来代替使用属性:
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();
}