Dart异步编程疑问:为何response函数返回error而非responseString?
Dart Future/async/await 返回值误区分析
你的response()函数始终返回error的核心原因很直接:你在await后的then回调里返回的responseString没有被作为函数的返回值,函数最后一定会执行return 'error';这行代码。
具体原因拆解
- 当使用
await时,它会等待Future完成,并返回Future最终的结果。但你错误地把await和then混用了:await Future.delayed(...).then(...)的实际结果就是then回调返回的responseString,但你既没把这个结果赋值给变量,也没直接返回它。 - 不管
then里做了什么,await语句执行完后,代码会继续往下走,最终走到return 'error';,所以函数的返回值永远是'error'。
正确写法示例
方式1:纯async/await写法(更简洁推荐)
Future<String> response() async { print('awaiting response...'); var time = Duration(seconds:2); await Future.delayed(time); print('got response'); return 'responseString'; }
方式2:保留then但正确返回结果
Future<String> response() async { print('awaiting response...'); var time = Duration(seconds:2); // 把await的结果直接返回,取代后面的return 'error' return await Future.delayed(time).then((v){ print('got response'); return 'responseString'; }); }
关于修改后代码的双重打印
你修改后的代码里,先打印using responseString再打印using error,是因为:
then回调里直接调用了useResponseString('responseString'),这是Future完成时同步执行的;- 但函数本身最后还是返回
'error',所以main中await response()拿到的依然是'error',于是又触发了一次useResponseString('error')。
内容的提问来源于stack exchange,提问作者Al C
相关产品推荐
相关产品推荐

