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

.then获取AJAX Promise返回值异常:.NET6 MVC场景排查

.NET6 MVC异步请求返回结果异常排查与解决

问题现象

前端调用异步方法后,refreshDiv中拿到的data.Responded始终为false,但数据库中对应行已确认完成更新。

核心问题与修复步骤

1. 后端ProcessRow方法的逻辑错误

原代码中responded变量存在作用域问题:Task.Run的lambda内部定义的responded是局部变量,外层循环条件的!responded并未被正确更新,导致循环可能提前退出,返回未更新的旧数据。此外,直接使用Task.Run包裹数据库查询属于冗余操作,且未使用EF异步查询方法。

修正后的后端代码:

public async Task<ActionResult> ProcessRow([FromForm] string id)
{
    bool responded = false;
    do
    {
        // 使用EF异步查询获取最新状态,避免上下文缓存旧数据
        responded = await _dbContext.Rows
            .Where(row => row.Id == id && row.Responded)
            .AnyAsync();
        
        // 增加短延迟,避免高频查询数据库
        if (!responded)
            await Task.Delay(500);

    } while (!responded);

    // 重新查询最新的行数据,确保返回的是更新后结果
    var updatedRow = await _dbContext.Rows
        .FirstAsync(row => row.Id == id);
    
    return Json(updatedRow);
}

2. 前端processIt函数优化

原函数存在错误丢失问题,且未明确指定数据类型,可能导致JSON解析异常:

修正后的前端代码:

async function processIt(data) {
    try {
        return await $.ajax({
            type: "POST",
            url: "ProcessRow",
            data: { "Id": data },
            // 明确指定返回数据类型为JSON,避免自动解析错误
            dataType: "json"
        });
    } catch (error) {
        console.error(error);
        // 抛出错误,让调用方的catch分支处理
        throw error;
    }
}

调用时补充错误处理:

processIt(id)
    .then((data) => refreshDiv(data))
    .catch(err => console.error('处理请求失败:', err));

3. 关键验证点

  • 确保后端返回前从数据库重新查询最新数据,而非使用上下文缓存的旧对象;
  • 前端可在then中打印console.log(data),检查返回的JSON结构是否包含正确的Responded字段。

内容的提问来源于stack exchange,提问作者Henrik Erlandsson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 04:24:47