Dart中两个Future函数调用时延疑问及代码验证咨询
你的理解有误,两个函数每次调用都会产生3秒时延
不管调用functionA还是functionB,每次调用后要拿到返回值都得等3秒,不存在functionB可立即调用的情况。
两个函数的实际行为差异极小
functionA:直接返回一个会延迟3秒完成的Future对象,函数本身同步执行完毕,返回的Future在3秒后触发完成回调。functionB:因为加了async标记,函数会自动包装成返回Future的形式;内部的await会等待Future.delayed完成后,再把结果返回给外层的Future。本质上和functionA的最终效果一致——返回的Future都是3秒后完成,调用者获取结果的耗时完全相同。
async/await的核心作用
async/await是Dart提供的语法糖,目的是让异步代码的写法更接近同步代码、提升可读性,而非改变异步操作的执行时长:
async:标记函数为异步函数,自动将函数的返回值包装成Future(哪怕你返回的是同步值)。await:暂停当前异步函数的执行,直到后面的Future完成,再继续执行函数剩余逻辑,同时把Future的结果提取出来。
体现差异的自增函数示例
如果要通过代码体现不同异步写法的场景差异,可以设计一个带缓存的自增函数:让其中一个函数每次调用都生成新的延迟Future,另一个缓存已完成的Future,这样就能看出调用时延的区别:
int _counter = 0; // 每次调用都生成新的延迟Future,每次都要等3秒 Future<int> functionA() { return Future.delayed(const Duration(seconds: 3), () => ++_counter); } Future<int>? _cachedFuture; // 第一次调用会等3秒,后续调用直接返回已完成的缓存Future,无需等待 Future<int> functionB() async { _cachedFuture ??= Future.delayed(const Duration(seconds: 3), () => ++_counter); return await _cachedFuture; }
测试代码:
void main() async { print('开始调用functionA第一次'); print(await functionA()); // 等待3秒后输出1 print('开始调用functionA第二次'); print(await functionA()); // 再等待3秒后输出2 print('开始调用functionB第一次'); print(await functionB()); // 等待3秒后输出3 print('开始调用functionB第二次'); print(await functionB()); // 立即输出3,无需等待 }
这里的差异并非来自async/await本身,而是利用async函数可以更简洁地处理缓存逻辑——如果不用async/await,也能实现同样的缓存效果,但写法会更繁琐。
内容的提问来源于stack exchange,提问作者Hog Rider
相关产品推荐
相关产品推荐

