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

Helmut1978

具有以下代码:

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()?

julemand101

在Dart中,没有这样的方法可以使异步代码以同步方式运行。因此,您需要使异步方法返回a,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了该方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

异步运行同步代码

来自分类Dev

异步运行同步代码

来自分类Dev

在Haskell中,异步代码的运行速度比同步版本慢

来自分类Dev

如何运行可能的同步或异步代码?

来自分类Dev

Dart-使长时间运行的同步功能异步

来自分类Dev

异步代码中需要同步

来自分类Dev

在Flutter或Dart中同步运行Future

来自分类Dev

多级异步代码中的Dart错误

来自分类Dev

将异步扭曲代码集成到同步python代码中

来自分类Dev

如何以安全的方式从异步函数中调用同步函数

来自分类Dev

如何使异步Dart调用同步?

来自分类Dev

在MATLAB中运行“前同步码”代码

来自分类Dev

代码未在javascript中同步运行

来自分类Dev

使用超时在Java中运行异步代码

来自分类Dev

Scala中的同步和异步客户端代码

来自分类Dev

在同步代码库中实现异步性能优势

来自分类Dev

在同步调用的异步代码中捕获异常

来自分类Dev

在JavaScript中异步函数的末尾运行同步函数?

来自分类Dev

如何将dart-sqlite代码从同步样式更改为异步样式?

来自分类Dev

如何在与表单结合使用同步代码之前运行异步代码

来自分类Dev

如何使一些同步代码先于其他异步代码运行?

来自分类Dev

合同异步和同步代码

来自分类Dev

异步运行同步方法

来自分类Dev

运行同步方法异步

来自分类Dev

如何同步运行异步任务?

来自分类Dev

代码未同步运行

来自分类Dev

想要澄清异步javascript代码与同步代码

来自分类Dev

等待JS异步功能完成,然后再运行一些同步代码

来自分类Dev

无法在Laravel队列中以异步方式运行作业