首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用dartz重构颤振中的函数错误处理

如何用dartz重构颤振中的函数错误处理
EN

Stack Overflow用户
提问于 2020-06-27 03:24:46
回答 1查看 779关注 0票数 2

我有两种方法

代码语言:javascript
复制
@override
  Future<Option<StorageFailure>> init() async {
    final root = await getRootDir();
    return root.fold(
      (failure) => some(failure),
      (dir) {
        final images = Directory("$dir/images");
        final videos = Directory("$dir/videos");
        images.create(); // more error handling here (try|either)
        videos.create();
      },
    );
  }

  @override
  Future<Either<StorageFailure, Directory>> getRootDir() async {
    try {
      final root = await getApplicationDocumentsDirectory();
      return right(Directory("${root.path}/files"));
    } catch (e) {
      return left(StorageFailure(reason: e.toString()));
    }
  }

在折叠后的init方法上,我需要做更多的错误处理,但我不喜欢嵌套太多代码。另外,我也不知道如何从Failure函数返回一个right

有什么更好的方式来连锁这些价值观呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-28 15:47:34

最酷的一点是,您可以在结束时只执行一次操作并处理错误。如果程序无法获得根目录,则永远不会执行有关创建媒体子目录的部分。因此,不需要嵌套错误处理。

我自己也在学习函数式编程。因此,也许有一个更好的解决方案,但我会这样做:

代码语言:javascript
复制
// I intentionally added all type annotations for better understanding.
Future<Option<StorageFailure>> init() async {
  final Either<StorageFailure, Directory> root = await getRootDir();
  final Either<StorageFailure, Either<StorageFailure, Success>> result = await root.traverseFuture(createImagesAndVideosSubfolders);
  final Either<StorageFailure, Success> flattenedResult = result.flatMap(id);
  return flattenedResult.fold((failure) => some(failure), (success) => none());
}

Future<Either<StorageFailure, Success>> createImagesAndVideosSubfolders(Directory dir) async {
  try {
    await Directory('${dir.path}/images').create();
    await Directory('${dir.path}/videos').create();
    return right(Success('success'));
  } catch (e) {
    return left(StorageFailure(reason: e.toString()));
  }
}

将根directory

  • create获取为媒体目录(如果getRootDir失败,则root.traverseFuture方法只返回具有flatMap和id函数的嵌套的

  • )。traverseFuture方法是期货的地图版本。如果期货也有一个flatMap等价物,结果将不会被包装在任意一个,最后一步使结果变平是不必要的。

您可以通过直接返回init函数来简化init函数,而不是将其转换为选项。

就像这样:

代码语言:javascript
复制
Future<Either<StorageFailure, Success>> init() async {
  ...
  return result.flatMap(id);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62605504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档