You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化重复逻辑的异步方法?尝试Action参数遇阻求助

简化重复异步方法的解决方案

你的问题核心是异步委托选择错误——之前尝试用Action<bool, int>但它是同步委托,无法适配异步操作;同时不同方法的参数数量有差异,需要统一封装通用参数。

步骤1:提取通用异步操作方法

把重复的逻辑(会议存在判断、加载状态控制、数据刷新)抽成通用方法,接受一个异步委托执行差异化的核心操作:

private async Task ExecuteVoteOperation(bool args, int voteId, Func<bool, int, int, int, bool?, Task> operation)
{
    if (GeneralMeetingState.GeneralMeeting == null) return;

    // 提前准备所有通用参数
    var meetingId = GeneralMeetingState.GeneralMeeting.ID;
    var agendaItemId = AgendaItemId;
    var isUserOwner = GeneralMeetingState.IsUserOwner;

    _spinnerVisible = true;
    try
    {
        // 执行差异化核心操作
        await operation(args, voteId, meetingId, agendaItemId, isUserOwner);
        // 统一执行数据刷新
        await AgendaState.GetAgendaItem(meetingId, agendaItemId);
        await AgendaItemsDetailState.GetVotesList(meetingId, agendaItemId);
    }
    finally
    {
        // 确保无论是否异常,加载状态都会关闭
        _spinnerVisible = false;
    }
}

步骤2:简化原有四个方法

通过Lambda表达式将每个方法的差异化逻辑传入通用方法,大幅精简代码:

private async Task ChangePresence(bool args, int voteId)
{
    await ExecuteVoteOperation(args, voteId, async (a, v, m, ai, _) => 
        await AgendaItemsDetailState.ChangePresence(a, m, ai, v));
}

private async Task VoteFor(bool args, int voteId)
{
    await ExecuteVoteOperation(args, voteId, async (a, v, m, ai, o) => 
        await AgendaItemsDetailState.ChangeVoteFor(a, m, ai, v, o.Value));
}

private async Task VoteAgainst(bool args, int voteId)
{
    await ExecuteVoteOperation(args, voteId, async (a, v, m, ai, o) => 
        await AgendaItemsDetailState.ChangeVoteAgainst(a, m, ai, v, o.Value));
}

private async Task ChangeVoteAbstinence(bool args, int voteId)
{
    await ExecuteVoteOperation(args, voteId, async (a, v, m, ai, o) => 
        await AgendaItemsDetailState.ChangeVoteAbstinence(a, m, ai, v, o.Value));
}

关键说明

  1. 异步委托选型:用Func<..., Task>替代Action<...>,前者支持异步方法的Task返回值,适配你的异步操作需求。
  2. 参数统一处理:通用方法提前准备好所有可能用到的参数,传入的Lambda可选择性使用(比如ChangePresence不需要所有者参数,用_忽略即可)。
  3. 异常安全:添加try-finally块确保加载状态在任何情况下都会关闭,避免出现加载指示器一直显示的问题。

内容的提问来源于stack exchange,提问作者Koen De Groot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:16:11