具有以下代码:
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中,没有这样的方法可以使异步代码以同步方式运行。因此,您需要使异步方法返回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] 删除。
我来说两句