android RxJava Observable.from 到 post 到服务
android RxJava Observable.from to post to a service
我有一个项目列表,我需要提取一些值并对每个项目进行 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() 继续下一个项目并在最后 return responseMessages 的最终列表吗?正在发生的是,一切都同时发生。为了证实这一点,如果我在 toList
方法之前放置一个 delay(1, TimeUnit.Seconds) ,所有事情都会同时发生,只有最后的 onNext 被延迟。
我怎样才能做到这一点?有一个id列表,想一个个上传到服务器,等待一个个完成,成功或失败进行下一步
flatMap
将 "stack" 调用。它将订阅每个 Observable,然后按照它们到达的顺序发出结果。因此结果可能 而不是 被排序(参见 documentation)。
如果您希望结果有序,您应该查看 concatMap
运算符。(参见 documentation)
Observable.from(myList)
.concatMap{ item ->
return serviceInteractor.uploadToServer(item)
}
.map { serverResponse ->
return serverResponse.getResponseCode
}
.toList()
.subscrible{ responseList ->
// do something with all the responses
}
您可以通过this blog post.
获取更多信息
是的,您需要使用 ConcatMap
平面图使用merge operator while concatMap uses concat opertor.
所以顺序是这样的
flatMap输出序列为merged
concatMap 输出序列是 ordered
如本文所述answer
在这里你可以看看这个例子
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()
我知道我来晚了回答这个问题:)
我有一个项目列表,我需要提取一些值并对每个项目进行 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() 继续下一个项目并在最后 return responseMessages 的最终列表吗?正在发生的是,一切都同时发生。为了证实这一点,如果我在 toList
方法之前放置一个 delay(1, TimeUnit.Seconds) ,所有事情都会同时发生,只有最后的 onNext 被延迟。
我怎样才能做到这一点?有一个id列表,想一个个上传到服务器,等待一个个完成,成功或失败进行下一步
flatMap
将 "stack" 调用。它将订阅每个 Observable,然后按照它们到达的顺序发出结果。因此结果可能 而不是 被排序(参见 documentation)。
如果您希望结果有序,您应该查看 concatMap
运算符。(参见 documentation)
Observable.from(myList)
.concatMap{ item ->
return serviceInteractor.uploadToServer(item)
}
.map { serverResponse ->
return serverResponse.getResponseCode
}
.toList()
.subscrible{ responseList ->
// do something with all the responses
}
您可以通过this blog post.
获取更多信息是的,您需要使用 ConcatMap
平面图使用merge operator while concatMap uses concat opertor.
所以顺序是这样的
flatMap输出序列为merged
concatMap 输出序列是 ordered
如本文所述answer
在这里你可以看看这个例子
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()
我知道我来晚了回答这个问题:)