gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:34:10 26 4
gpt4 key购买 nike

具有以下代码:

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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com