如何调整await写法代码,使其与.then写法的异步行为完全一致
问题原因
两段代码行为差异的核心是pendingFutures中存储的Future的完成时机不同:
- 第一种写法里,
pendingFutures存储的是connection.query本身返回的Future,await该Future只会等待数据库请求完成,后续的缓存写入逻辑是在await返回后才执行,所以await结束时缓存还未写入 - 第二种
.then写法里,pendingFutures存储的是.then链式调用返回的新Future,该Future需要等数据库请求完成、且.then内部的缓存逻辑全部执行完才会进入完成状态,所以await结束时缓存已经写入完成
修改方案
你只需要把缓存逻辑也封装到存入pendingFutures的Future中即可,修改后的代码如下:
// 将数据库查询+缓存写入逻辑整体封装为Future存入pendingFutures pendingFutures[sqlQuery.hashCode] = () async { final queryResult = await connection.query(sqlQuery, timeoutInSeconds: 3600); final queryObj = RequestCacheStruct(sqlQuery.hashCode, DateTime.now(), queryResult!); requestsCacheList.add(queryObj); return queryResult; }(); // 此处await会等待上述完整逻辑执行完成后才返回 var queryResult = await pendingFutures[sqlQuery.hashCode]; await pendingFutures.remove(sqlQuery.hashCode);
修改后和.then写法的行为完全一致,await pendingFutures[xxx]返回时,缓存已经写入完成。
内容的提问来源于stack exchange,提问作者Dmitry Bubnenkov
相关产品推荐
相关产品推荐

