标签: reactive-programming

你如何注册/取消注册 Observable.FromEventPattern 中使用的事件的处理程序?

我从 Observable.FromEventPattern 得到一个 IObservable,如下所示:

SomeObject target = new SomeObject();
string eventName = "SomeEvent";
IObservable<T> obs = Observable.FromEventPattern<T>(target, eventName);
Run Code Online (Sandbox Code Playgroud)

据我了解,FromEventPattern 调用将自动为我生成添加/删除事件处理程序。但是处理程序何时真正被添加/删除?

我假设在订阅 IObservable 时添加了处理程序。处理订阅者时,处理程序是否也会自动取消注册?

.net c# reactive-programming system.reactive

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

RXJava将函数应用于Observable中的每个元素并返回它的可观察性

我有一个改装服务,它返回一个Observable并在每次加载时保存它.

我的改造服务:

@GET("url")
Observable<Order> getOrder();
Run Code Online (Sandbox Code Playgroud)

功能:

return SERVICE.getOrder()
            .map(order -> {
                save(order);
                return order;
            });
Run Code Online (Sandbox Code Playgroud)

但是,如果你看到我只是保存并返回相同的对象,有没有更简单的方法?

android reactive-programming rx-java retrofit

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

RxSwift中array上的CombineLatest

下面的代码是Ash Furrow在FRP演示中和使用RxSwift演示的。不幸的是,RxSwift的“ combineLatest”运算符最多只允许10个可观察对象。我正在寻找一种变通方法,以获得相同的结果,但是要在一系列可观察对象上。

有任何想法吗?

class SignupDemoViewController: UIViewController {
  @IBOutlet weak var emailAddressTextField: UITextField!
  @IBOutlet weak var passwordTextField: UITextField!
  @IBOutlet weak var signupButton: UIButton!

  let disposeBag = DisposeBag()

  override func viewDidLoad() {
    super.viewDidLoad()

    let emailIsValid = emailAddressTextField.rx_text >- map (isEmail)
    let passwordIsValid = passwordTextField.rx_text >- map (isPassword)

    combineLatest(emailIsValid, passwordIsValid)
        >- and
        >- signupButton.rx_subscribeEnabledTo
        >- disposeBag.addDisposable

    signupButton.rx_tap
        >- signup
        >- display
        >- disposeBag.addDisposable
  }
}
Run Code Online (Sandbox Code Playgroud)

reactive-programming swift

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

Cyclejs 和带值的触发事件

我正在尝试学习 cyclejs 和反应式编程,但我不知道如何使用值管理事件。

例如,我需要创建四个函数来进行一些数学运算,例如:

  • 添加
  • 减法
  • 分区
  • 乘法

这是我拥有的代码:

function main ({DOM}) {

  const secondNumber$ = DOM
    .select('.second-number')
    .events('change')
    .map(ev => ev.target.value)
    .startWith(0)

  const firstNumber$ = DOM
    .select('.first-number')
    .events('change')
    .map(ev => ev.target.value)
    .startWith(0)

  const addClick$ = DOM
    .select('.add')
    .events('click')
    .merge(firstNumber$)
    .merge(secondNumber$)
    .filter(value => console.log(value))
    .scan((nb1, nb2) => nb1 + nb2)


  return {
    DOM: addClick$.map(result =>
      div([
        input('.first-number',{type:'text'}),
        input('.second-number',{type:'text'}),
        button('.add', 'Add'),
        h2('Result is : ' + result)
      ])
    )
  };
}
Run Code Online (Sandbox Code Playgroud)

它根本不起作用,我无法弄清楚我在那里做错了什么。

我正在寻找一个简单的解释,我怎样才能使它起作用?我觉得 secondNumber$ 和 firstNumber$ 的合并流不正确,我找不到原因..

任何的想法 ?

编辑:我知道我不应该使用我正在使用的运算符,而是使用 withLatestFrom。 …

javascript reactive-programming rxjs cyclejs

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

如何检测observable是否在RxSwift中没有在特定时间内发出任何事件

我试图检测一个observable(我的情况button.rx.tap)是否没有发出任何值,比如3秒.如果是,我想更新用户界面.这是我到目前为止的尝试:

Observable<Int>.interval(3, scheduler: MainScheduler.instance)
    .takeUntil(button.rx.tap) // I know take until will stop the timer sequence 
    .subscribe({ event in
        print(event)
        UIView.animate(withDuration: 0.4, animations: {
            if let number = event.element {
                let scale: CGFloat = number % 2 == 0 ? 1.5 : 1.0
                self.button.transform = CGAffineTransform(scaleX: scale, y: scale)
            }
        })
    })
    .addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)

我的目标是在没有按下按钮三秒钟时为视图设置动画.我已经尝试过扫描,distinctUntilChangeddebounce但是我遇到的大多数组合运算符只会在observable发出一个项目时才会发出项目.任何帮助深表感谢.

reactive-programming swift rx-swift rx-cocoa

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

在不处理慢速 IO 的情况下,从性能的角度来看,使用响应式编程有意义吗?

将响应式编程与 Java 和Project Reactor 结合使用在处理慢速 IO 或想要将结果回传给最终用户时非常有意义。您编写的代码往往看起来更简洁——类似于使用函数式编程和流时——但您也被迫以不同的方式编写代码,这让不熟悉该概念的程序员的生活变得更加艰难。

我想知道从性能的角度来看,使用它是否有意义?如果程序除了某些屏幕输出(例如计算无限 PI 数或斐波那契数列)之外没有任何 I/O,它会不会减慢您的计算速度?或者您的代码清洁度的收益是否会降低成本?

java reactive-programming project-reactor

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

我应该使用“then”还是“flatMap”来控制流?

所以,我正在尝试使用 Webflux 并且我有一个场景“检查对象是否存在;如果存在,请执行操作,否则 - 指示错误”。

这可以在反应堆中写成:

public Mono<Void> handleObjectWithSomeId(Mono<IdType> id){
    return id.
        flatMap(repository::exists). //repository.exists returns Mono<Boolean>
        flatMap(e -> e ? e : Mono.error(new DoesntExistException())). 
        then(
            //can be replaced with just(someBusinessLogic())
            Mono.fromCallable(this::someBusinessLogic) 
        );
}
Run Code Online (Sandbox Code Playgroud)

或作为:

public Mono<Void> handleObjectWithSomeId(Mono<IdType> id){
    return id.
        flatMap(repository::exists). //repository.exists returns Mono<Boolean>
        flatMap(e -> e ? e : Mono.error(new DoesntExistException())). 
        map(e -> this.someBusinessLogic()));
}
Run Code Online (Sandbox Code Playgroud)

假设返回类型 ofsomeBusinessLogic不能改变并且它必须是 simple void,而不是Mono<Void>

在这两种情况下,如果对象不存在,Mono.error(...)则会生成适当的对象。

虽然我理解这一点then并且flatMap有不同的语义,但实际上我得到了相同的结果。即使在第二种情况下我使用flatMap它的含义,我也可以跳过flatMapfromCallable支持简单map …

java reactor reactive-programming

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

如何返回 Mono&lt;ResponseEntity&gt;,其中响应实体可以是两种不同类型

我是 Spring Webflux / Reactor Core 的新手,正在尝试执行以下功能:

  1. 调用 userservice.LoginWebApp()

  2. 如果返回用户,则返回“用户”类型的 ResponseEntity。如果为空,则返回“String”类型的 ResponseEntity

以下代码给出了一个类型错误,因为 .defaultIfEmpty() 需要类型为 user 的 ResponseEntity。您能否就实现此功能的正确操作员/方法提出建议。

@PostMapping("api/user/login/webApp")
public Mono<ResponseEntity> login(@RequestBody Credentials credentials, ServerWebExchange serverWebExchange) {
     return userService.loginWebApp(credentials, serverWebExchange)
             .map(user -> ResponseEntity.status(HttpStatus.OK).body(user))
             .defaultIfEmpty(ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password"));
}
Run Code Online (Sandbox Code Playgroud)

functional-programming reactive-programming project-reactor spring-webflux

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

在 RxJava2 中将 Listener 转换为 Single

我正在使用 Play Services Auth api Phone,到目前为止我有以下内容

  fun startSmsListener() {
    val client = SmsRetriever.getClient(applicationContext /* context */);
    val task = client.startSmsRetriever();
    task.addOnSuccessListener(object : OnSuccessListener<Void> {
        override fun onSuccess(p0: Void?) {
             //do somethin
        }

    })
    task.addOnFailureListener(object : OnFailureListener {
        override fun onFailure(p0: Exception) {
            //Handle error
        }

    })
}
Run Code Online (Sandbox Code Playgroud)

现在我想把它放在一个 SmsManager 类中,并将它转换成一个 Single/Observable,这样我就可以在我的视图模型中以一种反应方式处理它。我怎样才能做到这一点?

到目前为止,我有这个:

var single = Single.create(SingleOnSubscribe<Void> { e ->
                val task = client.startSmsRetriever()
                task.addOnSuccessListener {
                    e.onSuccess(it)
                }
                task.addOnFailureListener {
                    e.onError(it)
                }
        })
Run Code Online (Sandbox Code Playgroud)

但我不确定这段代码是否正确,是否有遗漏的东西,比如在处理后删除监听器。

有什么帮助吗?

android reactive-programming kotlin rx-java rx-java2

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

自定义类 Flux 中的排序顺序

假设我有一个带有属性 name 和 height 的 Student 类。

class Student{ String name; double height;}
Run Code Online (Sandbox Code Playgroud)

如果我有大量学生对象,并且我想按学生姓名的升序对输出进行排序,那么我该怎么做?

reactive-programming project-reactor

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