如何将异步promise代码转换为rxjava

rOr*_*lig 8 java android promise rxjs rx-java2

我有以下同步代码,我想在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() {
   } 
} 
Run Code Online (Sandbox Code Playgroud)

现在在JS中,我可以像Prom这样建模这种与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);
  } 
} 
Run Code Online (Sandbox Code Playgroud)

我想在RXJava2中对其进行建模.任何帮助表示赞赏.

Woo*_*Kim 2

首先,抱歉我的英语不好。

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

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

  1. 您想知道如何实现异步递归。
  2. 处理列表或为空。

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

class Action {
  Maybe<List<Action>> handle() {}
}
Run Code Online (Sandbox Code Playgroud)

这是您的 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())));
}
Run Code Online (Sandbox Code Playgroud)

重要的是,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.
Run Code Online (Sandbox Code Playgroud)

附言。

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

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