我知道我的问题措辞不好,但我正在努力理解期货,以及asyncawait的运算,感觉我甚至不够理解提出这个问题!当我运行此代码时:

import 'dart:io';

void main() async {
  clickLink();
  sendGet();
  String r = await response();
  useResponseString(r);
  done();
}

void clickLink() => print('link clicked');

void sendGet() => print('sending get');

Future<String> response() async {
  print('awaiting response...');
  var time = Duration(seconds:2);
  await Future.delayed(time).then((v){
      print('got response');
      return 'responseString';
  });
  return 'error';
}

void useResponseString(String s) {
  print('using $s');
}

void done()=>print('done');

我得到

link clicked
sending get
awaiting response...

然后两秒钟后

got response
using error
done

当我逐行浏览这段代码时,我不明白为什么response()返回"Error"而不是"ResponseString".

如果我将函数更改为

Future<String> response() async {
  print('awaiting response...');
  var time = Duration(seconds:2);
  await Future.delayed(time).then((v){
      useResponseString('responseString);
      return 'responseString';
  });
  return 'error';
}

我得到

link clicked
sending get
awaiting response...

然后两秒钟后

using responseString
using error
done

.then()函数在2秒后运行,像我预期的那样调用useResponseString(是的),但主函数对useResponseString的调用再次返回值"Error"而不是"ResponseString".我遗漏了什么?

推荐答案

我认为这里的普遍误解是,从future 返回一个值将影响包含该future 的函数返回的内容.你可以在一个函数中等待多个期货,或者你甚至可以同时等待多个期货.

让我们放大future :

await Future.delayed(time).then((v){
      print('got response');
      return 'responseString';
});

发生的情况是,您设置了一个在2秒(Future.delayed(time))后解析的future ,并链接了一个回调(.then((v){...})),该回调将生成另一个在您的例子中返回string的future .这一切都在等待,但没有保存在任何地方.您可能需要存储结果:

var result = await Future.delayed(time).then((v){
      print('got response');
      return 'responseString';
});
// result will have the value 'responseString'

您的函数只有一条返回语句(return 'error';),并且将始终返回该语句.希望这能澄清这一点.:-)

Dart相关问答推荐

如何为屏幕设置不同的主题?

Flutter Web:无法用鼠标向下滚动(drag)(Flutter 2.5+)

flutter: 使用提供程序时,状态在热重载时丢失

Flutter中包导入和普通导入有什么区别?

如何调整ShowDialog的子级大小

Flutter 从asset文件夹中读取所有文件

使用 Google Dart 进行数据库查询?

Flutter-如何更改文本字段边框 colored颜色 ?

如何在 Flutter 中管理 Firebase 身份验证状态?

如何在flatter中使用SQFlite更新数据库表

在调试和生产模式之间切换

使用Flatter向Cloud Firestore添加对象

GestureDetector onTap 卡

在 Dart 中将类类型作为变量传递

如何用dart语言初始化超类变量?

如何将条目添加到列表中的特定索引?

如何在抽象类中声明工厂构造函数?

dart - 数字格式

Dart 中的 Math.round() 在哪里?

Dart,如何在你自己的函数中创建一个返回的future ?