面试题答案
一键面试在Flutter中,处理这种复杂嵌套的异步场景可以使用async
/await
语法,它可以将异步代码以同步的方式书写,避免回调地狱,提高代码的可读性和可维护性。
解决方案步骤:
- 定义异步函数:分别定义获取用户基本资料、获取用户详细权限列表和获取用户可访问特定资源列表的异步函数。
- 使用
async
/await
:在主函数中,按顺序调用这些异步函数,并使用await
等待前一个异步操作完成后再进行下一个操作。
代码示例:
// 模拟获取用户登录信息后获取用户基本资料的异步函数
Future<Map<String, dynamic>> fetchUserProfile(Map<String, dynamic> loginInfo) async {
// 这里模拟网络请求,实际应替换为真实的API调用
await Future.delayed(const Duration(seconds: 1));
return {'id': 1, 'name': 'John Doe', 'permissionFlag': 'admin'};
}
// 根据基本资料中的标识获取用户详细权限列表的异步函数
Future<List<String>> fetchUserPermissions(Map<String, dynamic> userProfile) async {
await Future.delayed(const Duration(seconds: 1));
if (userProfile['permissionFlag'] == 'admin') {
return ['create', 'update', 'delete'];
} else {
return ['read'];
}
}
// 根据权限列表获取用户可访问的特定资源列表的异步函数
Future<List<String>> fetchAccessibleResources(List<String> userPermissions) async {
await Future.delayed(const Duration(seconds: 1));
if (userPermissions.contains('admin')) {
return ['resource1','resource2','resource3'];
} else {
return ['resource1'];
}
}
// 主函数,处理整个异步流程
Future<void> main() async {
Map<String, dynamic> loginInfo = {'username': 'test', 'password': 'test'};
try {
// 获取用户基本资料
Map<String, dynamic> userProfile = await fetchUserProfile(loginInfo);
// 根据基本资料获取用户详细权限列表
List<String> userPermissions = await fetchUserPermissions(userProfile);
// 根据权限列表获取用户可访问的特定资源列表
List<String> accessibleResources = await fetchAccessibleResources(userPermissions);
print('可访问的资源列表: $accessibleResources');
} catch (e) {
print('发生错误: $e');
}
}
在上述代码中:
fetchUserProfile
、fetchUserPermissions
和fetchAccessibleResources
函数模拟了异步操作,如网络请求,并返回Future
对象。main
函数使用async
/await
按顺序调用这些异步函数,确保每个步骤依赖前一步的结果。同时使用try-catch
块捕获可能出现的异常。这样的代码结构清晰,易于理解和维护,避免了回调地狱的问题。