标签: reactive-programming

使用Rx处理可观察序列中的错误

如果发生错误,有没有办法让一个可观察的序列继续执行序列中的下一个元素?从这篇文章看起来你需要在Catch()中指定一个新的可观察序列来恢复执行,但是如果你需要继续处理序列中的下一个元素呢?有没有办法实现这个目标?

更新:场景如下:我有一堆我需要处理的元素.处理由一系列步骤组成.我已将这些步骤分解为我想要编写的任务.我按照这里发布的ToObservable()指南 将任务转换为可观察的构图.所以我基本上都是这样做的 -

foreach(element in collection)
{
   var result = from aResult in DoAAsync(element).ToObservable() 
         from bResult in DoBAsync(aResult).ToObservable() 
         from cResult in DoCAsync(bResult).ToObservable() 
         select cResult;
   result.subscribe( register on next and error handlers here)
 }
Run Code Online (Sandbox Code Playgroud)

或者我可以这样:

var result = 
        from element in collection.ToObservable() 
        from aResult in DoAAsync(element).ToObservable() 
         from bResult in DoBAsync(aResult).ToObservable() 
         from cResult in DoCAsync(bResult).ToObservable() 
         select cResult;
Run Code Online (Sandbox Code Playgroud)

这里继续处理其他元素的最佳方法是什么,即使让我们说其中一个元素的处理会引发异常.我希望能够记录错误并理想地继续前进.

reactive-programming system.reactive

12
推荐指数
2
解决办法
5753
查看次数

我可以在更改时保存反应对象的旧值吗?

注意:在得出答案后,我重写了问题,如果更清楚的话.

有时在shiny应用程序中.我想使用用户为窗口小部件选择的值,以及为该窗口小部件选择的先前值.这可以应用于从用户输入派生的反应值,其中我想要旧值和新值.

问题是,如果我尝试保存窗口小部件的值,那么包含该值的变量必须是被动的,或者每次窗口小部件更改时都不会更新.但是,如果我将值保存在被动上下文中,它将始终为我提供当前值,而不是前一个值.

如何保存窗口小部件的先前值,但每次用户更改窗口小部件时仍会更新它?

有没有一种方法不需要actionButton每次用户更改东西时使用?避免actionButton添加一个是可取的,否则不必要,并为用户创建多余的点击.

r reactive-programming shiny shiny-reactivity

12
推荐指数
2
解决办法
2422
查看次数

功能反应式编程(FRP)可以使用monads表示吗?

我一直在阅读功能反应式编程,虽然我没有在任何语言中广泛使用monad,但我不禁在FRP设计中到处看到它们.

这个问题的答案有什么反应性官能编程一些精彩的描述,我不会试图在这里复制.基本上,FRP创建了随时间变化的值之间的关系.

所以不能单独表示吗?封装需要在monad中随时间修改的值的代码,调用它Signal,然后使用这些信号(为简单起见,使用Haskell do-notation).

do
  mx <- mouseX
  my <- mouseY
  wave <- currentTime >>= liftM sin
  -- do some stuff with these values
Run Code Online (Sandbox Code Playgroud)

或者FRP还有比我理解的更多吗?是否存在使用monad阻止使用这种简单表示的范例?或者这是对FRP如何运作的有效(如果可能是简化的)理解?

javascript monads haskell functional-programming reactive-programming

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

subscribeOn和observeOn只能由最终订阅者调用吗?

Intro to Rx调度和线程部分说明了这一点

SubscribeOn和ObserveOn的使用只能由最终订阅者调用

它还说,在UI应用程序中,表示层(通常是最终订阅者)应该是调用这些方法的表示层.

我想知道这个建议是否可靠,因为我看到一些不方便的情况:

  1. 对于初学者,我不认为表示层应该决定应该订阅来自数据层的Observable的位置.在我看来,如果数据来自数据库,REST API或内存,表示层应该不知道.因此,subscribeOn()在返回Observable之前调用数据层很方便,方便地传递IO Scheduler或直接调度程序.
  2. 如果表示层从某个服务或用例(从数据层获取它)获得Observable,并且该服务决定它需要在某个计算Scheduler中处理流,那么表示层为什么要关心这个呢?
  3. 那个最初来自UI的流怎么样,所以需要在UI线程中订阅.然后它将被发送到一些服务来做一些工作,最后回到表示层,以便在UI线程中观察.这将要求UI流是subscribeOn()UI调度程序,然后是observeOn()其他调度程序,最后observeOn()是UI调度程序.在这种情况下,只能在最终订阅者中调用subscribeOn(),observeOn()这意味着只能在UI线程中处理该流.

我有理由牺牲应用程序的体系结构并忽略Rx通过最终订阅者调用这两种方法来轻松切换线程的能力吗?

reactive-programming system.reactive rx-java reactivex

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

在render中调用setState是不可避免的

反应文件指出render函数应该是这意味着它不应该使用this.setState它.但是,我相信,当状态依赖于"远程",即从阿贾克斯call.The唯一的解决办法的结果是setState()一个内部render功能

在我的情况下.我们的用户可以登录.登录后,我们还需要检查用户的访问权限(ajax调用)来决定如何显示页面.代码是这样的

React.createClass({
     render:function(){
          if(this.state.user.login)
          {
              //do not call it twice
              if(this.state.callAjax)
              {
              var self=this
              $.ajax{
                  success:function(result)
                  {
                      if(result==a) 
                      {self.setState({callAjax:false,hasAccess:a})}
                      if(result==b) 
                      {self.setState({callAjax:false,hasAccess:b})}

                  }
              }
              }
              if(this.state.hasAccess==a) return <Page />
              else if(this.state.hasAccess==a) return <AnotherPage />
              else return <LoadingPage />
          }
          else
          {
            return <div>
                   <button onClick:{
                   function(){this.setState({user.login:true})}
                   }> 
                   LOGIN
                   </button>
                   </div>
          }
     }
})
Run Code Online (Sandbox Code Playgroud)

ajax调用不能出现,componentDidMount因为当用户单击LOGIN按钮时,页面被重新呈现并且还需要ajax调用.所以我认为唯一的地方setState是在render函数内部违反了React原则

更好的解决方案?提前致谢

asynchronous reactive-programming reactjs

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

如何在网络关闭时处理React-Native中的网络故障

当设备未连接到网络时,如何处理React-Native中的网络故障.

我的方案是尝试连接一些api,同时在网络断开时获取请求react-native抛出网络请求失败错误.如何处理此方案以为用户提供最佳用户体验.

如何以更好的方式处理网络请求失败.

在此输入图像描述

facebook reactive-programming facebook-javascript-sdk reactjs react-native

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

RxJs flatMapLatest/switchMap取消回调.onCancel()在哪里?

我有2个嵌套的Observable Streams来做HTTP请求.现在我想显示一个加载指示器,但无法使其正常工作.

var pageStream = Rx.createObservableFunction(_self, 'nextPage')
        .startWith(1)
        .do(function(pageNumber) {
            pendingRequests++;
        })
        .concatMap(function(pageNumber) {
            return MyHTTPService.getPage(pageNumber);
        })
        .do(function(response) {
            pendingRequests--;
        });

Rx.createObservableFunction(_self, 'search')
        .flatMapLatest(function(e) {
            return pageStream;
        })
        .subscribe();



search();
nextPage(2);
nextPage(3);
search();
Run Code Online (Sandbox Code Playgroud)

这将触发pendingRequests++4次,但pendingRequests--只触发一次,因为flatMapLatest在前3个HTTP响应到达之前将取消内部observable.

我找不到像onCancel回调那样的东西.我也试过onCompletedonError,但这些不会太受被触发flatMapLatest.

有没有其他方法让这个工作?

谢谢!

编辑:所需的加载指示器行为

  1. 示例:单个search()呼叫.

    • search() - >开始加载指标
    • 当search()响应返回时 - >禁用加载指示符
  2. 示例:search()nextPage()致电.( search()响应返回之前调用nextPage().)

    • search() - >开始加载指标
    • nextPage() - >指标已经启动,但这里没什么可做的
    • 两个响应到达后停止加载指示器
  3. 示例: …

javascript reactive-programming observable rxjs

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

如何手动将下一个信号发送到RxSwift中的observable?

我使用以下代码创建一个observable:

let disposeBag = DisposeBag()

let myJust = { (element: String) -> Observable<String> in
    return Observable.create { observer in
        observer.on(.next(element))
        //observer.on(.completed)
        return Disposables.create()
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码来自RxSwift的示例代码.

如果我创建一个空的Observable myJust,稍后我会尝试发送一个值:

myJust("").on(.completed)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error: value of type 'Observable<String>' has no member 'on'
Run Code Online (Sandbox Code Playgroud)

reactive-programming ios swift rx-swift

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

我可以一起使用SpringMvc和webflux吗?

我想在一个项目中使用2种方法(反应式和标准式)。

我尝试将一个REST API端点迁移到反应式Webflux并测试性能,然后再迁移其余的。但这没有用。我为他添加了路由器和处理程序,但是直到我没有spring-boot-starter-web从依赖项中删除并禁用 @RestController我,我一直404都得到了HTTP 代码。有没有可能?还是应该将所有项目迁移到被动方法?

java reactive-programming spring-boot project-reactor spring-webflux

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

Netty 和 Project Loom

我可能错了,但据我所知,整个Reactive/Event Loop 的事情,尤其是Netty,是为了解决C10K+问题而发明的。它有明显的缺点,因为您的所有代码现在都变成了Async,带有丑陋的回调无意义的堆栈跟踪,因此难以维护和推理。

带有 goroutines 的Go语言是一个解决方案,现在他们可以编写Sync代码并处理C10K+。所以现在Java提出了Loom,它基本上复制了Go的解决方案,很快我们将拥有FibersContinuations,并且将能够再次编写Sync代码。

所以问题是:

  1. Loom投入生产时,是不是让Netty有点过时了?

  2. 如果我们在Java 中FibersContinuations,我们能写出漂亮的Sync代码并且在没有Netty 的情况下使用C10K+吗?

  3. Loom 的生产版本发布后,在编写Async代码和使用Netty方面,对于性能或解决C10K+是否有任何优势?

我知道Netty不仅仅是Reactive/Event Loop框架,它还拥有各种协议的所有编解码器,这些实现无论如何都会有用,即使在之后也是如此。

java asynchronous reactive-programming netty java-loom

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