标签: reactive-programming

Concat 运算符 RxSwift

我有一些这样的代码:

let first = Observable<Int>.create({ observer -> Disposable in
    observer.onNext(1)
    return Disposables.create()
})
let second = Observable.of(4, 5, 6)
let observableConcat = Observable.concat([first, second])
observableConcat.subscribe({ (event) in
    print(event)
})
Run Code Online (Sandbox Code Playgroud)

我对 concat 运算符的了解是“它订阅集合的第一个序列,中继其元素直到它完成,然后移动到下一个。重复该过程,直到使用了集合中的所有可观察对象”。所以我期望代码片段的结果是 1、4、5、6,但我得到的只是 1。请教我我对 concat 运算符的误解。

非常感谢。

concat reactive-programming ios swift rx-swift

1
推荐指数
1
解决办法
3642
查看次数

可观察订阅未触发

我开始研究 Reactive Extensions 以及如何将它们应用于常见场景以启用更易于管理和可读的代码。

我现在正在研究基本概念,并构建了一个简单的类:

public class ValidatableObject<TValue>
{
    public bool IsValid { get; private set; } = true;
    public TValue Value { get; }
    public ICollection<IValidationRule<TValue>> Rules { get; }

    public ValidatableObject(TValue value)
    {
        Value = value;
        Rules = new List<IValidationRule<TValue>>();
        Rules.ToObservable()
             .All(rule => rule.Check(Value))
             .Subscribe(b => IsValid = b);
    }
}

public interface IValidationRule<T>
{
    bool Check(T value);
}

public class FailingValidationRule<T> : IValidationRule<T>
{
    public bool Check(T value) => false;
}

public static void main()
{
    var …
Run Code Online (Sandbox Code Playgroud)

c# reactive-programming system.reactive

1
推荐指数
1
解决办法
985
查看次数

.net 观察者模式变体(IObservable 和事件委托)以及何时使用它们之间有什么区别?

我只想知道何时使用每个以及每个的优点我真的很难理解为什么 .net 在拥有事件委派后引入 IObservable/IObserver 并且根据 MSDN 事件委派是首选

基于我们对观察者模式的理解,现在让我们将注意力转向在 .NET Framework 中使用这种模式。熟悉 FCL 中公开的类型的人会注意到框架中不存在 IObserver、IObservable 或 ObservableImpl 类型*。它们缺席的主要原因是 CLR 使它们过时了。尽管您当然可以在 .NET 应用程序中使用这些构造,但引入 *delegates 和 events 提供了一种新的强大方法来实现观察者模式,而无需开发专用于支持此模式的特定类型。事实上,由于委托和事件是 CLR 的第一类成员,因此该模式的基础已整合到 .NET Framework 的核心中。像这样,

那么为什么他们将 IObservable 添加到 .net 4.0

c# design-patterns reactive-programming

1
推荐指数
1
解决办法
531
查看次数

使用 Spring 5 下载 PDF 文件时出错

我尝试使用 Spring 5 下载 PDF 文件。以下是我的代码:

@RequestMapping(path = "/pdf", method = { RequestMethod.POST }, produces = MediaType.APPLICATION_PDF_VALUE)
public Mono<ResponseEntity<Resource>> getPDF(ServerHttpRequest httpRequest) 
{
    File file = new File(filepath);
    ResponseEntity<Resource> resource = getResource(file);
    return Mono.justOrEmpty(resource);
}

public ResponseEntity<Resource> getResource(File file) {
   final InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
   HttpHeaders headers = new HttpHeaders();
   headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + file.getName());
   headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
   headers.add("Pragma", "no-cache");
   headers.add("Expires", "0");
   return ResponseEntity.ok().headers(headers).contentType(MediaType.APPLICATION_PDF).contentLength(file.length()).body(new InputStreamResource(inputStream));
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下异常:

java.lang.NoSuchMethodError: reactor.core.publisher.Flux.doOnDiscard(Ljava/lang/Class;Ljava/util/function/Consumer;)Lreactor/core/publisher/Flux;

在 org.springframework.core.io.buffer.DataBufferUtils.readByteChannel(DataBufferUtils.java:105) 在 org.springframework.core.io.buffer.DataBufferUtils.read(DataBufferUtils.java:202) 在 org.springframework.core.io .buffer.DataBufferUtils.read(DataBufferUtils.java:170) at org.springframework.core.codec.ResourceEncoder.encode(ResourceEncoder.java:76) at …

java spring reactive-programming project-reactor

1
推荐指数
1
解决办法
201
查看次数

当我有一个唯一键时,我收到一个唯一键道具警告

我是 React 的新手,但我知道唯一键的主要概念。但是,我收到警告。

下面我有一个项目组件:

class Item extends Component {
    state = {}

    render() { 
        return ( 
            <React.Fragment>
                {this.props.item.todo}
            </React.Fragment>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是我的项目组件以及我有唯一键的地方:

render() { 
    const { items } = this.props;
    return ( 
        items.map(item=>
            <React.Fragment>
                <Item key={item.todo} item={item} />
            </React.Fragment>
        )    
    );
}
Run Code Online (Sandbox Code Playgroud)

有了这一切,我收到了警告!

html javascript reactive-programming reactjs

1
推荐指数
1
解决办法
1431
查看次数

在 Vert.x 应用程序中使用 Project Reactor

我在 Vert.x 应用程序中使用了一个库,它返回Project Reactor类型Mono

我有一个 Verticle 接收这种反应类型,并打算通过事件总线将内容发送到另一个 Verticle:

import io.vertx.core.AbstractVerticle;
import io.vertx.core.eventbus.Message;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;

import java.time.Duration;

public class HelperVerticle extends AbstractVerticle
{
    public static final String ADDRESS = "address_1";

    @Override
    public void start() throws Exception
    {
        vertx.eventBus().consumer(ADDRESS, this::consume);
    }

    private void consume(Message<Object> message)
    {
        Mono.delay(Duration.ofMillis(3000)) 
            .thenReturn("Content of Mono.") // this would come from external library
            .publishOn(Schedulers.fromExecutor(vertx.nettyEventLoopGroup())) // is this needed?
            .subscribe(output ->
            {
                System.out.println("My verticle: " + Thread.currentThread().getName());
                message.reply(output + " " + message.body()); …
Run Code Online (Sandbox Code Playgroud)

java reactive-programming vert.x project-reactor reactive-streams

1
推荐指数
1
解决办法
1004
查看次数

RxSwift 中 Observable 最后两个元素的运算符

我有一个可观察的Ints序列:

-1-2-3-4-5-6-3-4-5-1-
Run Code Online (Sandbox Code Playgroud)

例如,我需要检测前一个元素何时大于最后一个元素。

在这个序列中它是(6, 3)(5, 1)

-1-2-3-4-5-6-3-4-5-1-
-------------ˆ-----ˆ-
Run Code Online (Sandbox Code Playgroud)

在这种情况下我可以使用哪个运算符?

reactive-programming observable rx-swift reactive

1
推荐指数
1
解决办法
609
查看次数

如何避免 .flatMap(x-&gt;reactiveAction(x).thenReturn(x))

在使用项目反应器库的 Java 响应式编程期间,我偶然发现了一种模式,我想知道是否有开箱即用的支持?

所以我想要下面的代码:

Mono.just("hello")
    .flatMap(hello -> reactiveAction(hello).thenReturn(hello))
    ..
    .;
Run Code Online (Sandbox Code Playgroud)

变成类似的东西:

Mono.just("hello")
    .coolOperation(this::reactiveAction)
    ..
    .;   
Run Code Online (Sandbox Code Playgroud)

我不能使用 doOnNext 因为我想在 reactAction 中做的不是副作用。和反应动作是:

Mono<Integer> reactiveAction(String text){
  return ....
}
Run Code Online (Sandbox Code Playgroud)

java mono publisher reactive-programming project-reactor

1
推荐指数
1
解决办法
288
查看次数

结合:如何取消 flatMap 的发布者

此处是结合和反应式编程的新手,因此非常感谢您的帮助。

我有以下场景:我想构建一个用户界面,用户可以通过页面上的各种“过滤器”按钮过滤内容。当用户点击其中一个按钮时,我需要发出 API 请求以获取数据。

现在,我有一个发布者为我提供这些选择的“状态”,我将代码结构如下:

        state
            .publisher /* sends whenever 'state' updates behind the scenes */
            .debounce(for: 1.0, scheduler: DispatchQueue.main)
            .map { /*  create some URL request */ }
            .flatMap {
                URLSession.shared.dataTaskPublisher(for: someRequest)
                    .map { $0.data }
                    .decode(type: MyResponseType.self, decoder: JSONDecoder())
        }.sink(receiveCompletion: { (completion) in
            /// cancelled
        }) { (output) in
             /// go show my results
             /// Ideally, this is only called when the most recent API call finishes!
        }.store(in: &cancellables)
Run Code Online (Sandbox Code Playgroud)

但是,此实现在以下场景中存在错误:如果一个事件通过 flatMap 来触发请求,并且后续事件在网络调用完成之前执行相同的操作,那么我们将调用完成处理程序两次。

最好,我们以某种方式取消内部管道,因此我们只执行具有最新事件的完成处理程序。

当新事件沿着管道进入管道时,我如何“取消”该内部管道(由 dataTaskPublisher 启动的管道)而不拆除外部管道?

reactive-programming ios swift combine

1
推荐指数
1
解决办法
1061
查看次数

结合,map() 与 tryMap() 运算符

我一直在玩苹果的Combine框架,在那里我找到了几个运营商map() & tryMap()allSatisfy() & tryAllSatisfy

Combine 中的许多操作符都遵循这种模式,我想知道这意味着什么。

我经历过很多运营商,他们中的大多数都有前缀try. 如果有人能以最简单的方式让我知道,那将非常有帮助。

谢谢

reactive-programming swift combine

1
推荐指数
1
解决办法
605
查看次数