Squeak.ru - шаблоны программирования

Как получить наблюдаемую, которая изменяется всякий раз, когда изменяется другая наблюдаемая

Проблема

У меня есть сервис, который выглядит так:

DogService { 
    public getSelectedDog(): Observable<Uuid> {...}
    public getDog(dogUuid: Uuid): Observable<Dog> {...}
}

Я хотел бы создать Observable, который всегда содержит выбранную мной собаку, т.е. Observable<Dog>.


Что я пробовал до сих пор

В настоящее время я делаю следующее:

let selectedDog: Observable<Dog> =  dogService.getSelectedDog().flatMap( selectedDog => {
    return dogService.getDog( selectedDog );
});

Затем вы можете подписаться на изменения в выбранной собаке следующим образом:

selectedDog.subscribe( dog => console.log( 'dog: ", dog.name, dog.mood );

К сожалению, похоже, это не работает так, как я ожидал. Наблюдаемый объект selectedDog срабатывает только тогда, когда selectedDog изменился, а не когда изменилась сама собака.

Итак, например, скажем, что мы делаем следующее:

const dog1: Dog = new Dog( '1',      // uuid
                           'Shadow', // name
                           'happy'   // mood
);

const dog2: Dog = new Dog( '2',      // uuid
                           'Barky',  // name
                           'Angry'   // mood
);


// Fires the getDog observable
dogService.addDog( dog1 );  

// Fires the getDog observable
dogService.addDog( dog2 );

// Fires the getSelectedDogObservable
dogService.selectDog( dog1.uuid )

// --- Now in console.log we will see: 'dog: Shadow happy'

К сожалению, если я обновлю собаку, консоль не войдет в:

const updatedDog1: Dog = new Dog( '1',      // uuid
                                  'Shadow', // name
                                  'SAD'   // mood
                                   );
// Fires the getDog observable
dogService.updateDog( updatedDog1 );

// --- the console.log doesn't get invoked.  Crap.

Вопрос: как создать Observable<Dog>, который будет срабатывать при изменении выбора или выбранной собаки?


  • Чтобы на это можно было ответить, вам необходимо включить реализацию службы, поскольку именно здесь необходимо будет внести изменения. 29.07.2017
  • @cartant - я не думаю, что это правда... 29.07.2017
  • @cartant верен, я думаю, поскольку вы, вероятно, будете использовать тему в своем сервисе для обновления остальных наблюдаемых. 29.07.2017

Ответы:


1

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

Одна ошибка, которую вы должны исправить, заключается в том, что вы используете flatMap, но должны использовать switchMap. Дело в том, что flatMap будет объединять каждый поток в ваш поток независимо от того, когда вы выберете новую собаку, а это означает, что вы будете продолжать получать обновления предыдущих выбранных собак, которые вам не нужны. Итак, вот код, о котором я говорил:

var dogs = [
  Rx.Observable.timer(0, 500).map(() => 'barky'),
  Rx.Observable.timer(0, 1000).map(() => 'cuddles')
];

var selectedDog = 0;
var dogSelector = Rx.Observable
  .timer(0, 5000)
  .map(_ => {
    selectedDog = (selectedDog ? 0 : 1);
    return selectedDog;
  })
  .switchMap(i => dogs[i]);

dogSelector.subscribe(dog => console.log(`Doggy: ${dog}`))

http://jsbin.com/haqutehajo/1/edit?js,console

Новая собака выбирается каждые 5 секунд, и каждая собака отправляет обновление каждые 1 или полсекунды соответственно. Также попробуйте flatMap вместо switchMap, и вы поймете, о чем я говорю.

29.07.2017
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...