Futures 和异步代码在 Dart 中如何工作?

问题描述 投票:0回答:1

我知道我的问题措辞不佳,但我很难理解 Futures,以及

async
await
操作,感觉我什至不了解足以提出问题!当我运行这段代码时:

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');

我明白了

链接已点击
发送获取
等待回应...

然后两秒后

得到回应
使用错误
完成

当我逐行检查这一行时,我不明白为什么

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';
}

我明白了

链接已点击
发送获取
等待回应...

然后两秒后

使用响应字符串
使用错误
完成

.then()
函数在 2 秒后运行,调用
useResponseString
正如我所期望的(耶),但是主函数对
useResponseString
的调用再次返回值“error”而不是“responseString”。我错过了什么?

dart asynchronous async-await
1个回答
0
投票

我认为这里的普遍误解是从未来返回一个值会影响包含未来的函数返回的内容。您可以在一个函数中等待多个期货 - 或者您甚至可以一次等待多个期货。

让我们放大未来:

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

发生的事情是你设置了一个在 2 秒后解决的未来(

Future.delayed(time)
)并链接一个回调(
.then((v){...})
)产生另一个未来,在你的情况下返回
string
。这一切都在等待,但没有保存在任何地方。你可能想要的是存储结果:

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

你的函数只有一个返回语句(

return 'error';
)并且总是返回它。希望能解决这个问题。 :-)

© www.soinside.com 2019 - 2024. All rights reserved.