asynchronous - 在Dart中以同步方式运行异步代码

标签 asynchronous dart async-await

具有以下代码:

Future<String> checkPrinter() async {
  await new Future.delayed(const Duration(seconds: 3));
  return Future.value("Ok");
}

String getPrinterStatus() {
  checkPrinter().then((value) {
    return 'The printer answered: $value';
  }).catchError((_) {
    return "Printer does not respond!";
  });
}

void main() {
  print(getPrinterStatus());
}

输出为“空”,因为函数getPrinterStatus()返回而无需等待checkPrinter完成(正确地,我有一条警告告诉我getPrinterStatus不返回字符串)。

我应该怎么做才能使getPrinterStatus等待checkPrinter()?

最佳答案

在Dart中,没有这样的方法可以使异步代码以同步方式运行。因此,您需要进行设置,以便异步方法返回Future,以便可以等待答案。

您的代码中存在的问题是您正在使用then方法,但是没有考虑到该方法返回了您应该返回的Future。因此:

String getPrinterStatus() {
  checkPrinter().then((value) {
    return 'The printer answered: $value';
  }).catchError((_){
    return "Printer does not respond!";});
}

此示例中的两个return语句用于您作为then()的参数给出的方法,因此不用于从getPrinterStatus()返回。

相反,then()返回一个Future<String>,它将以该值完成。

因此,您需要在程序中携带async。您的代码可以利用您通过标记方法async所获得的一些语言功能,因此我试图重写您的代码,使其按预期工作并利用以下功能:
Future<String> checkPrinter() async {
  await Future.delayed(const Duration(seconds: 3));
  return "Ok";
}

// Just an example that the method could be written like this.
// Future.delayed takes a computation as argument.
Future<String> checkPrinterShorter() =>
    Future.delayed(const Duration(seconds: 3), () => 'Ok');

Future<String> getPrinterStatus() async {
  try {
    return 'The printer answered: ${await checkPrinter()}';
  } catch (_) {
    return "Printer does not respond!";
  }
}

Future<void> main() async {
  print(await getPrinterStatus());
}

我认为您应该注意一些变化:
  • 如果将方法标记为async,则返回的值将自动打包到Future<Type>中,因此您无需返回Future.value("Ok"),而只需返回Ok即可。
  • 如果将方法标记为async,则可以使用await而不是then()。另外,您可以使用常规的异常处理,所以我重写了getPrinterStatus来做到这一点。
  • 关于asynchronous - 在Dart中以同步方式运行异步代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62059121/

    相关文章:

    javascript - 基本异步等待javascript

    c# - 如何捕获从 HttpWebRequest.GetResponseAsync 抛出的异常?

    animation - 如何在 appBar 图标的购物车图标上添加商品编号?我怎样才能让它动画添加新项目?

    c# - 等待任务时忽略特定类型异常的更简单方法

    c# - 如果第一个代码正在执行,如何等待?

    http - 如何使用 Tornado HTTPRequest 发布原始文件

    java - 如何在 Spring Integration 中将服务分配给消息驱动适配器?

    string - 如何在 Dart 语言中按字母顺序对字符串列表进行排序?

    flutter - 将 map 与AssetImage一起使用

    asp.net - 异步/等待、TPL、WCF 服务、Web API : So many choices