具有以下代码:
<td> </td>
输出为“ null”,因为函数getPrinterStatus()无需等待checkPrinter完成就返回(正确地,我有一条警告告诉我getPrinterStatus不返回字符串)。
我应该怎么做才能使getPrinterStatus等待checkPrinter()?
答案 0 :(得分:1)
Future<String> getPrinterStatus() async {
await checkPrinter().then((value) {
return 'The printer answered: $value';
}).catchError((_){
return "Printer does not respond!";});
}
答案 1 :(得分:0)
您的getPrinterStatus()
不是async
。 main()
函数将永远不会等待其执行。
将其设为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()
来做到这一点。