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

时间:2020-05-28 07:22:52

标签: asynchronous dart async-await

具有以下代码:

<td>&nbsp;</td>

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您的getPrinterStatus()不是asyncmain()函数将永远不会等待其执行。

将其设为async。将main()重构为类似

void main() {
  getPrinterStatus().then((value) {
    print(value);
  }).catchError((_){
    return "Printer does not respond!";});
}

答案 2 :(得分:0)

没有这种方法可以使异步代码在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"),而只需返回{{ 1}}。

  • 如果将方法标记为Ok,则可以使用async而不是await。另外,您可以使用常规的异常处理,所以我重写了then()来做到这一点。