async-await - 从同步函数调用异步函数
问题描述
我正在构建一个 Blazor 客户端应用程序。我正在使用MatBlazor组件。
我在一个页面上有两个 MatSelectString 控件。第一个用于选择类别,第二个用于从类别中选择产品。所以我有这样的设置:
<MatSelect Outlined="true" Label="Category" @bind-Value="@Category">
<MatOptionString></MatOptionString>
@foreach (var cat in GetCategories())
{
<MatOptionString Value="@cat">@cat</MatOptionString>
}
</MatSelect>
<MatSelect Outlined="true" Disabled="@(!string.IsNullOrWhiteSpace(Category))" Label="Product" @bind-Value="@Product" >
<MatOptionString></MatOptionString>
@foreach (var prod in GetProducts(Category))
{
<MatOptionString Value="@prod">@prod</MatOptionString>
}
</MatSelect>
在GetProducts(Category)
代码中,我想调用后端。问题是只有一个HttpClient.GetJsonAsync<>()
方法,不能从非异步方法中调用。但是 GetProduct() 不能异步。
我尝试过的事情:
- 将对我的函数的调用放在异步 lambda 中(不允许在 foreach 或其他代码块中)
- 使用 Task.Result(挂起)
- 将后端调用放在其他组件级别的异步事件中(被多次调用)
有任何想法吗?
解决方案
您可以使用ValueChanged
事件回调:
<MatSelect
Outlined="true"
Label="Category"
ValueChanged="(string i)=>OnChangeCategory(i)"> @* <-- here *@
<MatOptionString></MatOptionString>
@foreach (var cat in GetCategories())
{
<MatOptionString Value="@cat">@cat</MatOptionString>
}
</MatSelect>
@code
{
protected async Task OnChangeCategory(string newValue)
{
this.Category = newValue;
// call backend async tasks
// ...
}
推荐阅读
- mysql - 如何计算用户唯一参考的每个订单订购的平均服务?(MySQL)
- node.js - 通过nodejs重新流式传输icecast流
- java - 如何避免连续两次生成相同的 2 个随机数
- c - 如何在设置C环境之前在uboot中使用汇编编写控制台(或就像printf()函数)?
- angular - 角度翻译插件没有启动
- postgresql - Sequelize Migration addIndex不按降序添加索引
- maven - 如何隔离多个共享的 Maven 存储库配置?
- ruby-on-rails - 复制表结构和除一个以外的所有索引 - postgres
- python - 返回属于多个组成员的名称列表,数据馈送与上一个问题不同
- opengl - 如何将 ueyesrc 缓冲区转换为 opengl 纹理?