【问题标题】:how to convert asynchronous promise code to rxjava如何将异步承诺代码转换为 rxjava
【发布时间】:2019-02-23 01:25:25
【问题描述】:

我有以下同步代码,我想在 RXJava 中建模为异步代码。

void executeActions(List<Action> action) {
  if (action == null || action.size() == 0) return;
  for (Action action: actions) { 
     executeActions(action.handle());
  } 
}


class Action {

   //implementation of handle 
   // return List<Action> or null. 
   List<Action> handle() {
   } 
} 

现在在 JS 中,我可以像这样使用 Promises 对这种交互进行建模。 (下面的伪代码-我的JS很弱)

executeActionsAsync(actions) { 
  var p = Promise.resolve(); 
  action.forEach(function(action) { 
    p = p.then(function() { 
           action.handle();    
        })
  } 
  return p; 
} 


class Action() { 
  function handle() { 
    actions = [];// some array of actions. 
    executeAsync(actions);
  } 
} 

我想在 RXJava2 中进行同样的建模。任何帮助表示赞赏。

【问题讨论】:

    标签: java android promise rxjs rx-java2


    【解决方案1】:

    首先,对不起我的英语不好。

    我编辑了整个答案,因为我没有听懂他的问题是什么。

    我不知道你的 Action 类的句柄函数是如何实现的,但是这个函数的返回值应该变成 RxJava2 的异步类。在这种情况下,Maybe 类。

    1. 你想如何实现异步的递归。
    2. 句柄列表或为空。

    如果你想处理某事或 null,请使用 Maybe。在 RxJava2 中

    class Action {
      Maybe<List<Action>> handle() {}
    }
    

    这是您的 Action 类的句柄返回的内容。

    void executeActions(Maybe<List<Action>> rxactions) {
      // add null check.
      // List<Action> handles as stream, but you can use for or iterator or whatever you want.
      rxactions.subscribe(actions -> actions.stream().map(action -> executeActions(action.handle())));
    }
    

    重要的是,handle() 函数正确返回。

    附加

    在 RxJava2 中,有多个类来处理异步。 单一的、可流动的、可观察的、可完成的。以及每个类的实例方法,订阅。

    简单地说,

    1.Single => 返回单个类。

    2.Flowable, Observable => 返回多个类。 (Flowable 比 Observable 更复杂,增加了背压。)

    3.Completable => 什么都不返回,只是成功与否。

    4.可能是返回 * 或 null。

    5.subscribe 是异步执行的。

    :: 每个类都可以轻松转换。

    :: 解决一个问题的方法有很多。所以仅供参考。

    ex) Single<List<Foo>> <=> Flowable<Foo> // This is not same. but treat as similar.
    

    PS。

    我也有过这样的经历。我认为您需要了解更多有关 RxJava2 的信息才能在任何地方正确使用。

    Promise 可以分为 Single、Flowable、Observable、Completable。如上所述。这是开始理解 RxJava2 的关键。

    【讨论】:

    • 我完全不确定这如何回答我的问题。如果不清楚,则通过 then 块和递归链接承诺。
    • @rOrlig 哦,您的意思是您的问题的关键是承诺的递归???
    猜你喜欢
    • 2021-05-17
    • 2016-01-08
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多