как преобразовать асинхронный код обещания в rxjava - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть следующий синхронный код, который я хотел бы смоделировать как асинхронный код в 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 я могу смоделировать это взаимодействие с Обещаниями следующим образом.(Псевдокод ниже - мой 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.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 21 сентября 2018

Прежде всего, извините за мой плохой английский.

Я отредактировал весь ответ, потому что не понял, в чем его вопрос.

Я не знаюкак реализовать функцию дескриптора вашего класса Action, однако возвращаемое значение этой функции должно измениться на асинхронные классы RxJava2.В этом случае, может быть, класс.

  1. Вы хотите, как реализовать рекурсию асинхронного.
  2. Обрабатывать список или ноль.

Используйте Может быть, если вы хотите обработать что-то или ноль.в 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. Может быть, возвращает * или ноль.

5.подписаться - выполнить эту асинхронную операцию.

:: Каждый класс может быть легко преобразован.

:: И существует так много способоврешить одну проблему.так что это просто справка.

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

PS.

У меня тоже был такой опыт.Я думаю, вам нужно больше узнать о RxJava2, чтобы правильно использовать его повсюду.

Обещание может делиться на Единый, Текучий, Наблюдаемый, Завершаемый.Как описано выше.Это КЛЮЧ, чтобы начать понимать RxJava2.

...