面试题答案
一键面试- 使用
Future.wait
结合try-catch
处理错误并释放资源:Future.wait
可以并发执行多个Future
,通过在try-catch
块中捕获异常,来处理请求失败的情况。- 对于释放资源(取消未完成的请求),可以使用
CancelToken
(在http
库中)。
- 代码示例:
假设我们使用
http
库进行网络请求。首先添加依赖:
然后编写如下代码:dependencies: http: ^0.13.5
import 'dart:async'; import 'package:http/http.dart' as http; Future<void> main() async { List<Future<http.Response>> requests = [ makeRequest('https://example.com/api1'), makeRequest('https://example.com/api2'), makeRequest('https://example.com/api3') ]; try { List<http.Response> responses = await Future.wait(requests); for (var response in responses) { print('Response status: ${response.statusCode}'); print('Response body: ${response.body}'); } } catch (e) { print('An error occurred: $e'); } } Future<http.Response> makeRequest(String url) async { var cancelToken = http.CancelToken(); Timer(Duration(seconds: 5), () => cancelToken.cancel());// 5秒后取消请求 try { return await http.get(Uri.parse(url), cancelToken: cancelToken); } on http.RequestCanceledException catch (e) { print('Request canceled: $e'); rethrow; } }
在上述代码中:
Future.wait
用于并发执行多个网络请求。try-catch
块捕获请求过程中的异常。- 在
makeRequest
方法中,使用CancelToken
来模拟超时取消请求,并且在捕获到RequestCanceledException
时重新抛出异常,以便外层try-catch
统一处理。这样既优雅地处理了错误,又能及时释放相关资源(取消未完成的请求)。