2016-12-14 2 views
1

У меня есть прокси, который вызывает несколько REST API для создания конечного результата для интерфейса. Пользовательский интерфейс построен с помощью KnockoutJS. Я использую методы task/async для асинхронного вызова API. Только 1 или 2 API возвращают список, все остальные возвращают объекты с плоскими значениями. Может ли Rx использоваться для объединения результатов тех API, которые не возвращают коллекцию? Поскольку вывод не является коллекцией, это означает, что он не является потоком событий, поэтому объединение таких вызовов api с Rx должно противоречить рекомендациям Rx?Являются ли реактивные расширения подходящими только для вызовов API, которые возвращают сбор?

+1

Можете ли вы поделиться некоторым кодом? –

+1

В обоих случаях вы возвращаете одно значение (в смысле Rx мира). Этот единственный элемент может быть скалярным значением или коллекцией, но он по-прежнему является всего лишь одним ответом HTTP (что делает предположение, что когда вы говорите, что REST означает HTTP). Если бы вы ответили потоком сообщений из WebSocket или фида Atom, то да в терминах Rx вы имели бы последовательность событий с мощностью более 1. В любом случае Rx будет радостно заниматься последовательностями 0, 1 или многих. –

ответ

1

Поскольку выход не является коллекцией, это означает, что это не поток событий, поэтому объединение таких вызовов api с Rx связано с рекомендациями Rx?

См. Вызов API как поток только одного события. Это событие может быть List, или просто Object.

Может ли Rx использоваться для объединения результатов тех API, которые не возвращают коллекцию?

Да! Reactive Extentions - это API для асинхронных вызовов. Не имеет значения, возвращает ли ваш API коллекцию, объект или ничего.

пример:

interface YourRemoteApi { 
     Observable<List<String>> users(); 
     Observable<User> userData(String id); 
     Observable<Void> deleteUser(String id); 
    } 


    class Main { 

      public static void main(String...args) { 

       YourRemoteApi api = ... 
       api.users() 
        // transform an Observable<List<String>> to Observable<String> 
        .flatMapIterable(ids -> ids) 
        // call in a async fashion api.userData() 
        .contatMap(id -> api.userData(id)) 
        .filter(data -> data.toDelete()) 
        // call in a async fashion api.deleteUser 
        .flatMap(data -> api.deleteUser(data.id)) 
        .subscribe(); 
      } 

    } 

PS: В этом примере используется RxJava. Он может отличаться в другом языковом порту (например, Reactive Extensions for .NET и т. Д.)

+0

Просто потому, что вы можете это не значит, что вам нужно. В Java у вас невероятно ограниченная выразительность и отсутствие синтаксической поддержки асинхронного программирования. В C#, VB и практически на любом другом языке у вас есть гораздо более сложные варианты. Java ужасен - не вижу в мире этого. –

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