我有一个 Blazor WebAssembly (PWA) 项目,带有单独的 ASP.NET api,用于访问存储在数据库中的产品数据。调用
/api/products/getAllProducts
端点需要几秒钟的时间,因为需要退货的产品相当多。该产品数据通过服务每天在服务器上更新一次。
产品数据需要存储以供客户端离线使用,因此我正在实现 IndexedDB 以用于本地产品存储。该代码有些未经测试,因为目前它仅位于产品页面的代码块中:
private IEnumerable<Product>? products;
protected override async Task OnInitializedAsync()
{
// get products from the api
products = await Http.GetFromJsonAsync<Product[]>("/api/products/GetAllProducts");
// add products fetched from api into local storage
using var db = await DbFactory.Create<IndexDb>();
db.allProducts.Clear();
foreach ( var product in products)
{
db.allProducts.Add(product);
}
await db.SaveChanges();
// get products from local storage
products = db.allProducts;
}
我的问题是,我什么时候应该从 api 调用刷新/重新填充本地 IndexedDB 产品列表,而不减慢/停止我的应用程序?在 blazor 应用程序启动时(这可能吗)?当他们打开包含所有产品的页面时?实际上,我只需要在他们当天第一次打开该产品数据时每天更新一次。
您可以在 MainLayout.razor 中实现此功能
@update()
@code{
public async Task update()
{
using var db = await DbFactory.Create<IndexDb>();
var lastUpdateTime = db.lastUpdateTime.Last();
if (lastUpdateTime.date < DateTime.Now.date)
{
db.allProducts.Clear();
foreach (var product in products)
{
db.allProducts.Add(product);
}
db.lastUpdateTime.Add(DateTime.Now);
await db.SaveChanges();
}
}
}