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

为何Dart程序未打印'wow'?是否为异步行为?代码遗漏了什么?

为什么你的代码看起来没打印'wow'?

首先得澄清:你的代码实际上是会打印'wow'的,如果没看到,大概率是两个原因:要么是程序进入无限循环后终端输出没及时刷新,要么是你误解了代码的执行顺序——你可能以为print('wow')会在Future.doWhile循环结束后才执行,但实际上它是同步代码,会在循环启动后立刻执行。

具体来说,Future.doWhile()的执行逻辑是:

  1. 先同步执行一次回调函数(检查name是否非空,此时name是空的,返回true);
  2. 把下一次回调调度到Dart的微任务队列中,然后立即返回一个Future对象;
  3. 紧接着你的print('wow')就会同步执行,所以'wow'应该已经被打印了,只是后续无限循环的微任务可能让你忽略了这条输出。

这确实属于Dart的异步行为

没错,Future.doWhile是Dart的异步API。虽然第一次回调是同步执行的,但后续的每次回调都是通过scheduleMicrotask异步调度的,整个循环的完成是依赖事件循环的微任务队列来实现的,完全符合Dart的异步模型。

你代码里遗漏的关键问题

  1. 没有读取用户输入更新name:你的代码只检查name是否非空,但从来没有从控制台获取用户输入来修改name,导致name.isNotEmpty永远为false,循环永远不会终止,程序会一直跑下去。
  2. 没有按需等待异步循环完成:如果你期望print('wow')在循环结束后执行,你需要用await等待Future.doWhile的Future完成(但现在循环永远不会结束,所以加了await后print('wow')永远不会执行)。
  3. 缺少输入处理逻辑:你需要添加读取控制台输入的代码,比如用异步的stdin监听来获取用户输入并更新name,这样循环才能正常终止。

举个修复后的示例:

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:pedantic/pedantic.dart';

bool _asking = false;
String name = '';

Future main() async {
  await askUserName();
}

Future askUserName() async {
  _asking = true;
  print('enter the name');
  
  // 异步监听用户输入
  unawaited(stdin.transform(utf8.decoder).listen((input) {
    name = input.trim();
  }));
  
  await Future.doWhile(() {
    if (name.isNotEmpty) {
      _asking = false;
      print('thank you');
      exit(0);
    }
    return _asking;
  });
  
  print('wow'); // 现在会在循环结束后执行
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:42:33