我有一个项目列表,我需要提取一些值,并为每个项目进行api调用。 要做到这一点,我正在使用这样的东西_
Observable.from(myList) .flatMap{ item -> return serviceInteractor.uploadToServer(item) } .map { serverResponse -> return serverResponse.getResponseCode } .toList() .subscrible{ responseList -> // do something with all the responses }好的问题是,我不知道为什么所有的呼叫都是并行的。 是不是应该等待第一个响应,映射结果,从Observable.from()继续下一个项目,最后返回responseMessages的最终列表? 发生的事情是,一切都在同一时间发生。 为了确认这一点,如果我在toList方法之前放置一个延迟(1,TimeUnit.Seconds),一切都在同一时间发生,只有最后的onNext被延迟。
我怎么能做到这一点? 有一个id列表,想要逐个上传到服务器,等待每一个完成,如果成功或失败则继续下一个
I have a list of items which i need to extract some values and make an api call for each of the item. To do that, i'm using something like this_
Observable.from(myList) .flatMap{ item -> return serviceInteractor.uploadToServer(item) } .map { serverResponse -> return serverResponse.getResponseCode } .toList() .subscrible{ responseList -> // do something with all the responses }Ok so the problem is, i don't know why all the calls are made in parallel. Isn't it supposed to wait for the first response, map the results, proceed to the next item from the Observable.from() and at the end return the final list of responseMessages? What is happening is, everything happens at the same time. To confirm this, if i put a delay(1, TimeUnit.Seconds) before the toList method, everything happens at the same time, only the final onNext is delayed.
How can i accomplish this? Have a list of ids, want to upload to server one by one, waiting for each one to complete, proceed to next if success or fail
最满意答案
是的,你需要使用ConcatMap
平面地图使用合并运算符,而concatMap使用concat opertor 。
所以顺序就是这样
flatMap输出序列已merged concatMap输出序列是ordered
如本答案所述
在这里你可以看看这个例子
String arrData[] = {"0", "1", "2", "3", "4"}; Integer arrDelay[] = {1000, 6000, 4000, 9000, 2000}; Observable.from(arrData) .concatMap(s -> Observable.from(arrData) .delay(arrDelay[Integer.parseInt(s)],TimeUnit.MILLISECONDS)) .map(integer -> integer) .toList() .doOnCompleted(() -> Log.v("log", "doOnCompleted")) .subscribe(integer -> Log.v("log", "" + integer));在这里你可以检查延迟将是arrDelay项的总和,因为我们已经使用了toList()
我知道我迟到了回答:)
Yes you need to use ConcatMap
Flat map uses merge operator while concatMap uses concat opertor.
so sequence will be like this
flatMap output sequence is merged concatMap output sequence is ordered
as described in this answer
here you can take a look on this example
String arrData[] = {"0", "1", "2", "3", "4"}; Integer arrDelay[] = {1000, 6000, 4000, 9000, 2000}; Observable.from(arrData) .concatMap(s -> Observable.from(arrData) .delay(arrDelay[Integer.parseInt(s)],TimeUnit.MILLISECONDS)) .map(integer -> integer) .toList() .doOnCompleted(() -> Log.v("log", "doOnCompleted")) .subscribe(integer -> Log.v("log", "" + integer));here you can check that delay will be total of arrDelay item as we have used toList()
i know i am late to give answer on this :)
更多推荐
发布评论