2017-01-22 5 views
0

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

На данный момент это мой текущий код.

usernameObservable 
      .skip(2) 
      .debounce(800, TimeUnit.MILLISECONDS) 
      .subscribe(username -> { 
       Observable<Boolean> observable = apiService.isAvailable(username); 
       observable.observeOn(Schedulers.io()) 
         .observeOn(AndroidSchedulers.mainThread()) 
         .subscribe(aBoolean -> { 

         }, throwable -> { 

         }); 
      }); 

На данный момент сетевой запрос делается в конце, но это возможно сделать запрос до и один раз я получаю данные я выполнять некоторые другие операции на потоке.

ответ

2

Вы ищете flatMap оператор. Это позволяет преобразовать событие в другое наблюдаемое, которое будет направлять выбросы в исходный поток. Уведомление об ошибке также будет отправлено.

usernameObservable 
     .skip(2) 
     .debounce(800, TimeUnit.MILLISECONDS) 
     .flatMap(username -> apiService.isAvailable(username)) 
     .subscribe(isAvailableResult -> { 
      // react here 
     }, throwable -> { 
      // show an error here 
     }); 
+0

Можно ли добавить других операторов после размещения карты и до подписания? Например, может быть, фильтр, если это так, будут обрабатываться данные, которые я получаю от вызова api, или работает ли мой оригинальный наблюдаемый? –

+1

Конечно, это возможно :-) Это красота Rx. Когда вы применяете оператор flatMap, каждый предмет, который приходит к нему, превращается в наблюдаемый. Все события, которые испускаются этими наблюдаемыми, которые вы определили в flatMap, будут перенаправлены обратно в исходный поток. Поэтому после flatMap вы работаете с результатами конечной точки API, которая соответствует вызову метода apiService.isAvailable(). Вы можете делать с ними все, что хотите, это регулярный поток. – koperko

+1

Тем не менее, я вижу, где я мог бы вас смутить. Я не переименовал аргумент в методе подписки. Конечно, это не имя пользователя больше, а результат конечной точки isAvailable(). Я отредактирую свой ответ – koperko

Смежные вопросы