У меня есть 2 вложенных Observable Streams, которые обрабатывают HTTP-запросы. Теперь я хочу отобразить индикатор загрузки, но не могу заставить его работать правильно.
var pageStream = Rx.createObservableFunction(_self, 'nextPage')
.startWith(1)
.do(function(pageNumber) {
pendingRequests++;
})
.concatMap(function(pageNumber) {
return MyHTTPService.getPage(pageNumber);
})
.do(function(response) {
pendingRequests--;
});
Rx.createObservableFunction(_self, 'search')
.flatMapLatest(function(e) {
return pageStream;
})
.subscribe();
search();
nextPage(2);
nextPage(3);
search();
Это приведет к срабатыванию pendingRequests++
4 раза, но pendingRequests--
только один раз, потому что flatMapLatest
отменит внутреннее наблюдение до получения первых 3 ответов HTTP.
Я не мог найти ничего похожего на обратный вызов onCancel
. Я также пробовал onCompleted
и onError
, но они тоже не срабатывают при помощи flatMapLatest
.
Есть ли другой способ заставить это работать?
Спасибо!
EDIT: поведение индикатора желаемой загрузки
-
Пример: одиночный вызов
search()
.- search() → индикатор загрузки
- когда возвращается запрос поиска() → отключить индикатор загрузки
-
Пример: вызов
search()
иnextPage()
. (nextPage() называется перед тем, как поиск() вернулся.)- search() → индикатор загрузки
- nextPage() → индикатор уже запущен, хотя здесь ничего не делать
- остановить индикатор загрузки после полученных < ответов
-
Пример:
search()
,search()
. (вызовы search() переопределяют друг друга, хотя ответ первого может быть отклонен)- search() → индикатор загрузки Индикатор
- search() → уже запущен, хотя здесь ничего не делать
- остановить индикатор загрузки, когда получен ответ второй поиск()
-
Пример:
search()
,nextPage()
,search()
. (Опять же: из-за второго поиска() ответы от предыдущего поиска() и nextPage() могут быть проигнорированы)- search() → индикатор загрузки
- nextPage() → индикатор уже запущен, хотя здесь ничего не делать Индикатор
- search() → уже запущен, хотя здесь ничего не делать
- остановить индикатор загрузки, когда ответ для второго поиска() прибыл
-
Пример:
search()
,nextPage()
. Но на этот раз nextPage() вызывается после ответа функции поиска().- search() → индикатор загрузки
- остановить индикатор загрузки, потому что получен запрос поиска()
- nextPage() → запустить индикатор загрузки
- остановить индикатор загрузки, потому что получен ответ nextPage()
Я попытался использовать счетчик pendingRequests
, потому что одновременно могу иметь несколько релевантных запросов (например: search(), nextPage(), nextPage()
). Тогда, конечно, я бы хотел отключить индикатор загрузки после всех завершенных соответствующих запросов.
При вызове search(), search()
первый поиск() не имеет значения. То же самое относится к search(), nextPage(), search()
. В обоих случаях есть только один активный релевантный запрос (последний search()
).