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

如何在反应链中传递数据

丌官利
2023-03-14

每当我需要在反应链中传递数据时,我都会做如下操作:

public Mono<String> doFooAndPassDtoAsMono(Dto dto) {
    return Mono.just(dto)
        .flatMap(dtoMono -> {
            Mono<String> result = // remote call returning a Mono
            return Mono.zip(Mono.just(dtoMono), result);
        })
        .flatMap(tup2 -> {
            return doSomething(tup2.getT1().getFoo(), tup2.getT2()); // do something that requires foo and result and returns a Mono
        });
}

给定以下示例Dto类:

class Dto {
    private String foo;

    public String getFoo() {
        return this.foo;
    }
}

因为一直压缩数据以将其传递到链中(特别是向下几级)通常会变得很乏味,我想知道直接引用dto是否可以这样做:

public Mono<String> doFooAndReferenceParam(Dto dto) {
       Mono<String> result = // remote call returning a Mono
        return result.flatMap(result -> {
            return doSomething(dto.getFoo(), result); // do something that requires foo and result and returns a Mono
        });
}

我对第二种方法的担忧是,假设订阅者在线程池上订阅了这个Mono,我需要保证Dto是线程安全的吗(上面的例子很简单,因为它只携带一个String,但是如果不是呢)?

另外,哪一个被认为是“最佳实践”?

共有2个答案

龚安民
2023-03-14

案子很简单如果

  • 参考数据从一开始就可用(即在创建链之前),并且
  • 创建链的目的是处理最多一个事件(即以单声道开始),以及
  • 参考数据是不可变的

然后,您可以简单地引用参数或局部变量中的引用数据——就像在您的第二个解决方案中一样。这完全没问题,也没有并发问题。

强烈反对在反应流中使用可变数据。如果您有一个可变的Dto类,您可能仍然能够使用它(假设正确的同步),但这对于您的代码读者来说将是非常令人惊讶的。

酆勇
2023-03-14

根据您共享的内容,您可以简单地执行以下操作:

public Mono<String> doFooAndPassDtoAsMono(Dto dto) {
    return Mono.just(dto.getFoo());
}

您在第一个选项中使用zip的方式并不能解决任何目的。同样,第二个选项也不起作用,因为一旦单声道是空的,下一个平面地图就不会被触发。

 类似资料:
  • 问题内容: 我一直试图获得一个快速应用程序,以流形式发送响应。 当我将“ rs.pipe(res)”替换为“ rs.pipe(process.stdout)”时,它会在控制台中打印,但是如何使其在快速应用程序中工作。 问题答案: 您不需要可读的流实例,只需使用: 之所以可行,是因为在Express中,它基于Node自己的,因此它继承了其所有方法(如)。

  • 我在问之前找了很多,但似乎找不到一个适合我的解决方案。 我有一个函数,我需要在状态设置为新值后调用。 即使该函数是作为setState回调调用的,它仍然获得旧值。

  • 顺便说一下,在使用/而不是发射器时,我遇到了同样的问题。我已经决定给你们举这个例子,因为它很容易理解和再现。

  • 悬而未决...

  • 本文向大家介绍如何在PowerShell函数中传递参数?,包括了如何在PowerShell函数中传递参数?的使用技巧和注意事项,需要的朋友参考一下 您可以在PowerShell函数中传递参数,并且要捕获这些参数,需要使用参数。通常,当您在函数外部使用变量时,您实际上不需要传递参数,因为变量本身是Public,可以在函数内部访问。但是在某些情况下,我们需要将参数传递给函数,下面的示例说明了如何编写该

  • 我试图在mapbox gl地图上设置一个标记,点击地图,然后将lngLat对象传递回父组件。请告诉我怎样才能做到这一点。我刚开始学习反应,但我知道道具只能从父类继承,setState只能设置本地状态。 父组件如下所示 我正在学习这个教程https://github.com/laneysmith/react-mapbox-example