Dart async/await 函数:当你的应用显示“加载中…”时,它实际在做什么
Source: Dev.to
“Loading…” 真正的含义
很长一段时间,我以为 “loading” 只是表示我的应用卡住了——不是崩溃,只是冻结,礼貌地等到数据最终出现。每次看到加载旋转图标,我都接受这就是应用的工作方式。
后来有一天,这种想法不再合理。我想象我的 Dart 应用是这样运行的:
- 运行一些代码
- 碰到
await - 一切停止
- 应用等待
- 数据到达
- 应用继续
简单、线性、让人安心。
但真实的应用并不是这样。按钮仍然可以点击,动画仍在播放,日志仍在输出——应用显然是活着的。那么到底在“等待”什么呢?
当应用显示 “Loading…” 时,它并不是在描述应用在做什么,而是在描述 你 在等待什么。幕后,Dart 应用仍在运行;它只是拒绝因网络请求或数据库调用等慢操作而阻塞自身。相反,它悄悄地说:
“我稍后再回来处理这件事。”
然后继续前进。
Dart 中 async 与 await 的真实工作方式
这时我恍然大悟:await 并不会暂停整个程序;它只会暂停 一个函数。当 Dart 函数遇到 await 时,它让位。事件循环继续运行,其他任务继续执行,UI 更新仍然发生,应用保持响应。你等待的 Future 在完成时完成,Dart 稍后平稳地恢复该函数。没有冻结。
作为初学者,我们往往按步骤思考:
- 第 1 行运行。
- 异步代码打破了这种思维模型。
于是出现了启动、暂停、恢复和重叠的情况。不是随机的,也不是单纯的直线。等我不再把异步代码强行套进线性故事时,它就不再神秘。它不是魔法——而是调度。
对调试和编写代码的影响
现在看到加载旋转图标,我的解读方式不同了。它不意味着 “应用卡住了”。它意味着 “应用在等待此操作完成的同时,正在忙于处理其他工作”。这种小小的转变改变了我的调试方式、日志阅读方式以及在 Dart 中编写异步函数的方式。
如果你在使用 Dart、Flutter 或任何现代框架,异步无处不在。大多数错误并非语法错误,而是错误的思维模型。只要你明白你的应用始终在运行,而 await 只是一次礼貌的暂停,事情就会变得更平静、更清晰,也不那么脆弱。
最终,我意识到我的应用从未冻结。它一直在忙碌——只是它不认为我需要所有细节。