【问题标题】:What is the differerce between calling a function with await and without it?使用 await 和不使用 await 调用函数有什么区别?
【发布时间】:2021-09-27 21:01:43
【问题描述】:

我来自使用线程而不是 async/await 的语言,我对 await 的目的感到困惑。

每个人都说await 关键字告诉程序等到async 函数完成,但是在下面的代码中我没有在doSmth() 调用前面使用await,但是,它们仍然暂停执行:

import 'dart:io';

Future<String> _loadFromDisc() async {
  sleep(Duration(seconds: 1));
  return 'idfromdisc';
}

Future<String> _fetchNetworkData(String id) async {
  sleep(Duration(seconds: 1));
  return 'somedata';
}

class ProcessedData {
  ProcessedData(this._data);
  String _data;
}

void doSmth() async {
  print('doSmth started');
  sleep(Duration(seconds: 1));
  print('doSmth finished');
}

Future<ProcessedData> createData() async {
  doSmth();
  doSmth();
  print('calling loadFromDisc');
  final id = await _loadFromDisc();
  print('calling fetchNetworkData');
  final data = await _fetchNetworkData(id);
  print('done');
  return ProcessedData(data);
}

void main() {
  createData();
}

我的意思是,这是有道理的,如果所有函数都立即执行会很奇怪,但是如果代码仍然以相同的方式工作,为什么我们需要await

【问题讨论】:

  • doSmth 暂停执行,因为它调用了 sleep,这会暂停隔离中的执行。 await 在您的示例中并不重要,因为您实际上并没有做任何异步操作。尝试用await Future.delayed(...) 替换sleep,然后你会看到不同。此外,正如所写,await doSmth() 原则上不起作用,因为doSmth 不会返回Future

标签: dart async-await


【解决方案1】:

想象一下你有一个异步代码 什么是异步的,如果它正在执行的代码需要很长时间,那是为了防止冻结和低性能,它让您可以转移到其他代码 你必须在这里从一个非常大的数据中获取 但是你之后需要这些数据 如果您在没有等待的情况下执行此操作,这将是一个承诺,并且您将遇到错误或不希望的结果,因此您必须等待它等待此提取然后继续希望我说清楚

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 2022-01-27
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2012-03-20
    相关资源
    最近更新 更多