java - RxJava - Non Deterministic behaviour when calling Observables methods -


i have problem following code:

public void foo(list<player> players_list) {      jsonarray playersarr = new jsonarray();      rx.observable.from(players_list) // assume players_list list contains 2 players     .concatmap(player -> {      return getuser(player.getuserid()) // entity 'user' db     .flatmap(userobj -> {         user user = ...;          playersarr.add(new jsonobject()             .putstring("uid", player.getextuserid())         );              return rx.observable.just(playersarr);         });     }).subscribe(playersobj -> {      }, (exception) -> {         log.error("", exception);      }, () -> {          // @ point expect 'playersarr' consist 2 entries!     }); } 

when running code seems output non-deterministic, meaning - of times valid results of 2 entries in jsonarray, 1 entry.

i'm trying figure out why??

edit:
tried switching .flatmap --> .concatmap , seems solve problem im not sure it's solution.

i asume playerarrs not thread safe, if observable executed in asynchronous context, maybe playerarrs may skip add call.

your observable have side effect, has update object exist outside observable. avoid this, can update code in way observable build jsonarray

public void foo(list<player> players_list) {      rx.observable.from(players_list) // assume players_list list contains 2 players                  .concatmap(player -> getuser(player.getuserid()) // entity 'user' db                  .map(userobj -> new jsonobject().putstring("uid", player.getextuserid())                 .reduce(new jsonarray(), (seed, acu) -> seed.add(acu))) // build jsonarray                 .subscribe(playersobj -> { },                             (exception) -> { log.error("", exception); },                            () -> {     // @ point expect 'playersarr' consist 2 entries!                  }); } 

i'm not sure of code, should close need, think.


Comments