Blazor aync 方法未完全执行



做一项任务,我被卡住了。我的代码没有完全通过。我认为等待、异步的东西存在问题。

我的问题是:在@foreach方法中,我调用了一个方法"loadEach";它检查当前订单行是否必须为橙色。但问题是,在loadEach方法的中间(在工作api调用之后(,它会立即被另一个订单再次调用。Id值和loadEach方法从未完全通过。我能做什么,让blazor等到loadEach方法完全完成,然后去构建表?

@foreach (var order in sortedOrders)
{
loadEach(order.Id).ConfigureAwait(true);
<tr style="background-color:@(hasPausedOperation == true ? "#ebc14d" : "")" @onclick="@(() => Selected(order.Id))">
@*<td @onclick="@(() => Selected(order.Id))">@order.WorkCenterValue</td>*@
<td>@order.OrderNumber</td>
<td>@order.Customer</td>
<td>@order.ExpectedStartDateTime?.ToString("yyyy-MM-dd")</td>
<td>@order.EndDateTime?.ToString("yyyy-MM-dd")</td>
<td>@order.ExternalWorker</td>
@*<td @onclick="@(() => Selected(order.Id))">@order.Priority</td>*@
</tr>
@if (orderId != null && orderId == order.Id)
{
<tr>
<td colspan="5">
<Logging orderId="order.Id" workCenter="workCenter"></Logging>
</td>
</tr>
}
hasPausedOperation = false;
}
protected async Task loadEach(int orderId)
{
if (orderId != 0)
{
works = await Http.GetFromJsonAsync<WorksListModel>($"Works?orderId={orderId}");
foreach (var work in works.Works)
{
if ((work.EndDateTime == null && work.StartDateTime != null && canStart && work.WorkLogEndDateTime != null))
{
hasPausedOperation = true;
}
}
}
}

您似乎需要每一行的信息。

最有效的解决方案是让服务器解决这个问题,这样总的执行时间会低得多。hasPausedOperation可以是WorkItem Dto/ViewModel的属性。

如果您确实希望它像这样延迟,那么将信息存储在共享变量中并不是最好的方法。Blazor不支持剃刀部分中的异步代码。

因此,选项a:

var hasPausedOperation = loadEach(order.Id); // no await

但这需要bool loadEach(int orderId),没有异步,没有任务。您必须调用HttpClient调用上的.Result。

更好的选项b,为行创建一个组件:

@foreach (var order in sortedOrders)
{
<OrderRow Order="@order" />
}

OrderRow组件中,您有一个async OnInitializedAsync((,可以在其中正确处理此问题。

您可以为<tr>创建一个组件。

相关内容

  • 没有找到相关文章

最新更新