在我的Flutter应用中,我想同时进行多个网络调用,然后在它们全部完成后执行一些操作。为此,我使用Future.wait()
,它可以执行我想要的操作。但是,当调用失败时,它将引发异常,该异常在某种程度上没有被异常处理程序捕获(即未捕获的异常)。
[当我单独执行await _fetchSomeData()
时(在Future.wait()
外部),异常确实被异常处理程序调用了。
Future<bool> someMethod() async {
try {
var results = await Future.wait([
_fetchSomeData(),
_fetchSomeOtherData()
]);
//do some stuf when both have finished...
return true;
}
on Exception catch(e) {
//does not get triggered somehow...
_handleError(e);
return false;
}
}
使用Future.wait()
时需要做什么以捕获异常?
更新:
我已经缩小了范围。原来,如果您在Future.wait()
调用的方法中使用另一个await语句,则会导致此问题。这里是一个例子:
void _futureWaitTest() async {
try {
//await _someMethod(); //using this does not cause an uncaught exception, but the line below does
await Future.wait([ _someMethod(), ]);
}
on Exception catch(e) {
print(e);
}
}
Future<bool> _someMethod() async {
await Future.delayed(Duration(seconds: 1), () => print('wait')); //removing this prevents the uncaught exception
throw Exception('some exception');
}
因此,如果您从_someMethod()
中删除等待行,或者只是在_someMethod()
之外调用Future.wait()
,将防止未捕获的异常。当然这是最不幸的,我需要等待http调用... Dart中的一些错误?
[我认为您对Future.wait()
的命名有点误导。 Future.wait()
返回另一个future,当每个future成功完成时,每个future将返回List
个元素。
现在,因为Future.wait()
仍然是未来。您可以通过两种方式处理它:
await
与try catch
一起使用。onError
回调。这将是类似的东西
Future.wait([futureOne, futureTwo])
.then((listOfValues) {
print("ALL GOOD")
},
onError: (error) { print("Something is not ok") }