具有以下代码:
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/