从同步函数调用异步函数
Calling an async function from a sync function
我正在构建 Blazor 客户端应用程序。我正在使用 MatBlazor 个组件。
我在一个页面上有两个 MatSelectString 控件。第一个用于 select 一个类别,第二个用于 select 类别中的产品。所以我把它设置成这样:
<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
EventCallback:
<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
// ...
}
查看
我正在构建 Blazor 客户端应用程序。我正在使用 MatBlazor 个组件。
我在一个页面上有两个 MatSelectString 控件。第一个用于 select 一个类别,第二个用于 select 类别中的产品。所以我把它设置成这样:
<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
EventCallback:
<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
// ...
}
查看