为何这段Dart异步代码未打印‘Instance of 'Future<String>'’?
为什么这段Dart代码没有打印
Instance of 'Future<String>'? 先看你给出的代码:
void main() { Stream stream = Stream.periodic(Duration(seconds: 1)); stream.listen((event) async { getName('Kushtrim').then(print); }); } Future<String> getName(String name) async { return Future.delayed(Duration(seconds: 2), () => '$name but HOMO SAPIENS'); }
核心原因在于**Future.then()的作用逻辑**:
getName返回的确实是Future<String>对象,但调用.then(print)时,你不是直接打印这个Future,而是给它注册了一个回调——当Future完成(也就是延迟2秒后拿到字符串结果)时,把这个结果传给print函数执行。- 换句话说,
then会自动提取Future的最终值,再传递给后续的回调,所以print接收到的是'Kushtrim but HOMO SAPIENS'这个字符串,而不是Future实例本身。
至于你担心的Stream周期(1秒)和Future延迟(2秒)的冲突:
Stream每隔1秒触发一次事件,每次触发都会生成一个新的Future,每个Future各自独立等待2秒后完成,然后调用print输出结果。两者的时间差只会导致打印的时间间隔是:第2秒第一次打印,第3秒第二次,第4秒第三次……以此类推,并不会影响then提取结果的逻辑。
如果想要打印Instance of 'Future<String>',你得直接打印Future对象本身,比如把代码改成:
stream.listen((event) async { print(getName('Kushtrim')); });
内容的提问来源于stack exchange,提问作者Ariel H.
相关产品推荐
相关产品推荐

