当前位置: 首页 > 知识库问答 >
问题:

链式反应组件调用

安浩瀚
2023-03-14

我有一个下面的对象列表,方法返回被动类型Mono

interface GuyWithReactiveReturnTypeMethod {

    Mono<String> execute();
}

class ReactiveGuysInvocator {

    Mono<String> executeAllGuys(List<GuyWithReactiveReturnTypeMethod> guysToInvoke) {
        ???
    }
}

我需要一个接一个地调用所有的guy(n的guy结果是n1的guy参数),但我不确定如何遍历这样的列表。我想到了flatMapwhile循环中的下一个家伙:

public interface GuyWithReactiveReturnTypeMethod {

    Mono<String> execute(String string);
}

class ReactiveGuysInvocator {

    Mono<String> executeAllGuys(List<GuyWithReactiveReturnTypeMethod> guysToExecute) {
        ListIterator<GuyWithReactiveReturnTypeMethod> iterator = guysToExecute.listIterator();
        Mono<String> currentResult = Mono.just("start");
        while (iterator.hasNext()) {
            GuyWithReactiveReturnTypeMethod guyToInvoke = iterator.next();
            currentResult = currentResult.flatMap(guyToInvoke::execute)
                    .doOnNext(object -> System.out.println("Executed!"))
                    .doOnError(error -> System.out.println("Error"));
        }
        return currentResult;
    }
}

但这种方法似乎完全不正确。有人知道我如何实现这样的东西吗?


共有1个答案

洪光霁
2023-03-14

更新:flatMap很容易被滥用。使用flatMap时,请确保您正在执行异步工作。大多数情况下,在我看来,你可以用最少的Mono做得很好。只要

Flatmap是您必须对所提供的约束进行的操作。

executeAllGuys(Arrays.asList(new GuyWithReactiveReturnTypeMethod[] {
        (s)->Mono.just(s+"1"), 
        (s)->Mono.just(s+"2"), 
        (s)->Mono.just(s+"3")})) 
.subscribe(System.out::println);

Mono<String> executeAllGuys(List<GuyWithReactiveReturnTypeMethod> guysToExecute) {
    // your flow is starting here
    Mono<String> stringMono = Mono.just("start");
    for ( GuyWithReactiveReturnTypeMethod guyToInvoke: guysToExecute) {
        stringMono = stringMono.flatMap(guyToInvoke::execute);
    }
    return stringMono;
}

看看那些Mono。只要打电话就行了。为什么要创建N 1流来执行此作业?真正的问题是每次执行接口方法时都会创建一个新的流Flatmap停止当前流,并使用Flatmap方法返回的发布者启动新流。试着思考反应性,并将整个业务视为一条流。Streams中没有flatMap。应仅在单个流上执行反应式执行。

A单声道

>

  • 通过获取Mono并返回Mono,使您的接口更加反应性。您的应用程序在每一步都进行map转换。这就是“连锁反应元件”。

    executeAllGuys(Arrays.asList(新GuyWithReactiveReturnTypeMethod[]{s)-

    Mono执行所有人(列表guysToExecute) { // 你的流从这里开始Mono stringMono=Mono.just("start"); for(Guy天反应返回类型方法guyToInvoke: guysToExecute){stringMono=guyToInvoke.execute(stringMono);}返回stringMono;}

    接口GuyWithReactiveReturnTypeMethod{Mono execute(Mono string);}

    通过使用Flux而不是列表,使您的界面反应性更小,但使应用程序反应性更强。然后必须使用reduce将通量转换为单声道。您的应用程序正在执行Map/Reduce功能。我不认为Flux可以保证流中元素的执行顺序,但它可以更有效地执行所有的购买。

    //你的流从这里开始执行所有的人(Flux.just-

    单声道执行所有人(通量guysToExecute){返回guysToExecute.reduce("start",(str, guyToInvoke)-

    参考:反应性编程:Spring WebFlux:如何构建微服务调用链?

  •  类似资料:
    • 我想在另一个Flux流中间调用Mono,向mono发送Flux参数。我正在使用SpringBoot的WebClient。 我试过这个: 但是,如何将第一个API调用的返回发送给param2?然后得到双方的回应?第一个API返回许多值,对于每个值,我需要调用第二个API。 谢谢

    • 有没有一种方法可以将样式化组件与React-Bootstrap一起使用?react-bootstrap为组件公开属性,而不是,这似乎与样式化组件不兼容。 有什么经历吗?

    • 应用程序: 接收以下有效负载: 我需要按以下方式进行处理: > 使用转换后的数据向“卡通数据库”微服务发送HTTP POST请求。 我遇到的问题是: 我需要使用(|)和)的

    • 我刚反应过来。Im正在尝试将包含链接的数组转换成将在网站中按顺序显示链接的东西。 类似这样的事情: 在服务器中显示的内容如下所示: 我试着做我找到的下面的代码,但是它失败了:

    • 我的react组件的构造函数被调用了两次,但我不知道为什么。我正在使用react redux存储我的应用程序的语言。我有一个基于浏览器语言设置默认语言的函数。LoginPage是第一个获得render的组件,因此我在其构造函数中调用了我的函数。基本上,它所做的就是比较并分派一个动作。当我用redux开发工具检查我的状态时,我看到它被调度了两次。我在构造函数中打印了虚拟数据,它也打印了两次。 登录页

    • 问题内容: 我有React表单,其中有一个用于渲染下拉菜单的Component,因为这些选项来自API。但是,我无法访问嵌入式组件的引用。我正在整理我的第一个表格,并试图了解解决此问题的最佳方法。 问题答案: 最好将视为回调属性,并且不再依赖于Object。如果确实使用对象,请避免访问后代组件。您应该将其视为私有访问器,而不应将其视为组件API的一部分。仅将组件实例上公开的方法视为其公共API。