gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:59:06 27 4
gpt4 key购买 nike

我有以下同步代码,我想在 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 中建立相同的模型。任何帮助表示赞赏。

最佳答案

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

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

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

  1. You wants how to implements recursion of async.
  2. Handle List or null.

如果你想处理某些东西或 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() 函数正确返回。

Additional

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

简单的说,

1.Single => 返回单个类。

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

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

4.Maybe is 返回 * 或 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 的关键。

关于java - 如何将异步 promise 代码转换为 rxjava,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52396219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com