.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
相关产品推荐
相关产品推荐

