将 subscribe() 重构为 map()/flatMap() Spring Webflux

Refactor subscribe() to map()/flatMap() Spring Webflux

我有这个方法,想摆脱 subscribe() (第 5 行)并改用 map() 或 flatMap() (因为在非阻塞范围内使用 subscribe() 不好) :

private Mono<HttpStatus> transferToGlobalLibrary(UnpublishedArticle unpublishedArticle) {
    return updateArticleService.updateArticle(unpublishedToOutputContentAdapter.adaptUnpublishedArticle(unpublishedArticle))
                .map(httpStatusUpdateArticle -> {
                    if (httpStatusUpdateArticle.is2xxSuccessful())
                        articleRepository.save(unpublishedArticle).subscribe();
                    return httpStatusUpdateArticle;
                });
 }

我尝试了以下方法:

return updateArticleService.updateArticle(unpublishedToOutputContentAdapter.adaptUnpublishedArticle(unpublishedArticle))
                .map(httpStatusUpdateArticle -> {
                    if (httpStatusUpdateArticle.is2xxSuccessful())
                        return articleRepository.save(unpublishedArticle)
                                .flatMap(savedArticle -> httpStatusUpdateArticle);
                    return httpStatusUpdateArticle;
                });

这给了我错误 不存在类型变量 R 的实例,因此 HttpStatus 符合 Mono。为什么会显示这个错误?

重构代码的最佳方法是什么?谢谢!

备注:

map 是 return 一个 Mono 的方法。

当你 return httpStatusUpdateArticle 它是 Mono< HttpStatus>.

flatMap 也 return 是 Mono。所以当你 return flatMapmap 里面时,那么 map return 就是 Mono<Mono<HttpStatus>>.

一个解决方案是首先不调用 map

return updateArticleService.updateArticle(unpublishedToOutputContentAdapter.adaptUnpublishedArticle(unpublishedArticle))
            .flatMap(httpStatusUpdateArticle -> {
                if (httpStatusUpdateArticle.is2xxSuccessful())
                    return articleRepository.save(unpublishedArticle)
                                            .map(savedArticle -> httpStatusUpdateArticle);
                return Mono.just(httpStatusUpdateArticle);
            });