진행중인 API 요청에 관찰 가능 항목 재사용

말하다

API를 자체적으로 쿼리하고 RX를 사용하여 캐시에 결과를 저장하는 구성 요소 A가 있습니다.

List<Data> cache = ...;

void queryData(int parameter) {
    myApi.getData(parameter).subscribe(data => cache.add(data));
}

이제 다른 구성 요소에서이 캐시를 쿼리하고 싶습니다. 캐시 미스시 기내 구독이있는 경우 다시 사용할 수 있도록 설계하고 싶습니다. 이는 동일한 요청이 중복되지 않도록하기위한 것입니다.

Observable별도의 캐시 에 저장할 생각입니다 (여전히 구성 요소 A에 있음).

List<Observable<Data>> requestCache = ...;

public Observable<Data> getData(int parameter) {
    // if cache contains data, return new observable that emits that item

    // if cache does not contain data, check if requestCache contains the Observable I need. If so, return it.

    // if all else fails, return queryData(parameter)

} 

원본 queryData을 다음과 같이 수정해야합니다 .

Observable<Data> queryData(int parameter) {
    Observable<Data> observable = myApi.getData(parameter);

    requestCache.add(observable);

    observable.subscribe(data => cache.add(data));
    observable.subscribe(data => requestCache.remove(observable));

    return observable;
}

이렇게하면 다른 구성 요소에 대한 이러한 요청의 캐싱 / 비행 중 복잡성이 완전히 숨겨집니다. 그러나 RX에 이것을 처리하는 내장 방법이 있는지 궁금합니다.

내가 올바른 길을 가고 있는가 아니면 더 나은 패턴이 있는가?

Akarnokd

이를 수행하는 기본 제공 방법은 없습니다. 이 문제를 해결하는 방법은 다음과 같습니다.

public final class ReactiveCache<K, V> {
    final Map<K, Observable<V>> requests = new HashMap<>();

    final Function<K, Observable<V>> generator;

    public ReactiveCache(Function<K, Observable<V>> generator) {
        this.generator = generator;
    }

    public Observable<V> get(K key) {
        ConnectableObservable<V> result;
        synchronized (requests) {
            Observable<V> current = requests.get(key);
            if (current != null) {
                return current;
            }

            result = generator.apply(key)
                    .doOnTerminate(() -> {
                        synchronized (requests) {
                            requests.remove(key);
                        }
                    })
                    .replay();

            requests.put(key, result);
        }

        return result.autoConnect(0);
    }
}

이 클래스에서 get ()을 호출하고 기내 관찰 가능 항목이 있으면이를 결합하고 모든 값을받을 수 있습니다. 아무것도 없거나 비행 중이 끝나면 새로운 Observable이 시작됩니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

ActivatedRoute 관찰 가능 항목과 API 요청의 관찰 가능 항목 결합

분류에서Dev

여러 관찰 가능 항목을 연결하고 체인에서 이미 실행 된 항목의 결과 재사용

분류에서Dev

각도 관찰 가능 항목을 사용하여 반복적 인 시간 간격 내에 API에서 데이터를 검색하는 방법

분류에서Dev

사용자 지정 바인딩 처리기에서 관찰 불가능한 항목 사용

분류에서Dev

rxjs를 사용하여 나중에 웹 소켓에 연결될 관찰 가능 항목을 만듭니다.

분류에서Dev

종속 중첩 관찰 가능 항목

분류에서Dev

하나의 관찰 가능 항목의 데이터를 다른 항목에 사용하고 다른 관찰 항목으로 결과를 반환합니다.

분류에서Dev

서비스를 사용하는 각도 다중 관찰 가능 요청

분류에서Dev

API (Angular, TypeScript, RxJS)에 대한 다중 요청을 시도하는 동안 TypeScript 관찰 가능 오류

분류에서Dev

관찰 가능한 컬렉션 내의 관찰 가능한 컬렉션을 목록 상자 항목에 바인딩

분류에서Dev

Angular RxJs 배열을 통해 루프를 수행하고 http get 요청을 단일 반응 관찰 가능 항목에 할당하는 방법

분류에서Dev

두 번째 두 호출에서 첫 번째 호출의 응답을 사용하는 Angular / RXJS 중첩 관찰 가능 항목

분류에서Dev

녹아웃에서 관찰 가능 항목 목록 정렬

분류에서Dev

관찰 가능 항목 반복 / 재설정

분류에서Dev

정렬 된 관찰 가능 컬렉션에 항목 추가

분류에서Dev

Knockoutjs를 사용하여 관찰 가능한 배열에서 항목을 제거 할 수 없습니다.

분류에서Dev

RXJS를 사용하여 돌연변이없이 관찰 가능 항목에서 단일 값 추출

분류에서Dev

RXJS 체인 종속 관찰 가능 항목을 순차적으로, 진행률 표시 줄에 대해 각 방출을 가져옴

분류에서Dev

관찰 가능 항목이 완료되는 원인 확인

분류에서Dev

Angular 2의 인증, 관찰 가능 항목 처리

분류에서Dev

관찰 가능 항목의 조건부 체인

분류에서Dev

RxJava는 항목 목록에 대해 관찰 가능한 체인을 만듭니다.

분류에서Dev

다른 관찰 가능 항목에서 Rxjs 스트림 전환

분류에서Dev

F #에서 두 개의 관찰 가능 항목 결합

분류에서Dev

입력 필드에서 관찰 가능 항목 찾기

분류에서Dev

RxJava에서 여러 관찰 가능 항목 결합

분류에서Dev

canDeactivate에서 두 개의 관찰 가능 항목 처리

분류에서Dev

내 주제에 "핫 스왑"관찰 가능 항목

분류에서Dev

중첩 된 관찰 가능 항목은 시간 초과 이후에만 오류를 전파합니다.

Related 관련 기사

  1. 1

    ActivatedRoute 관찰 가능 항목과 API 요청의 관찰 가능 항목 결합

  2. 2

    여러 관찰 가능 항목을 연결하고 체인에서 이미 실행 된 항목의 결과 재사용

  3. 3

    각도 관찰 가능 항목을 사용하여 반복적 인 시간 간격 내에 API에서 데이터를 검색하는 방법

  4. 4

    사용자 지정 바인딩 처리기에서 관찰 불가능한 항목 사용

  5. 5

    rxjs를 사용하여 나중에 웹 소켓에 연결될 관찰 가능 항목을 만듭니다.

  6. 6

    종속 중첩 관찰 가능 항목

  7. 7

    하나의 관찰 가능 항목의 데이터를 다른 항목에 사용하고 다른 관찰 항목으로 결과를 반환합니다.

  8. 8

    서비스를 사용하는 각도 다중 관찰 가능 요청

  9. 9

    API (Angular, TypeScript, RxJS)에 대한 다중 요청을 시도하는 동안 TypeScript 관찰 가능 오류

  10. 10

    관찰 가능한 컬렉션 내의 관찰 가능한 컬렉션을 목록 상자 항목에 바인딩

  11. 11

    Angular RxJs 배열을 통해 루프를 수행하고 http get 요청을 단일 반응 관찰 가능 항목에 할당하는 방법

  12. 12

    두 번째 두 호출에서 첫 번째 호출의 응답을 사용하는 Angular / RXJS 중첩 관찰 가능 항목

  13. 13

    녹아웃에서 관찰 가능 항목 목록 정렬

  14. 14

    관찰 가능 항목 반복 / 재설정

  15. 15

    정렬 된 관찰 가능 컬렉션에 항목 추가

  16. 16

    Knockoutjs를 사용하여 관찰 가능한 배열에서 항목을 제거 할 수 없습니다.

  17. 17

    RXJS를 사용하여 돌연변이없이 관찰 가능 항목에서 단일 값 추출

  18. 18

    RXJS 체인 종속 관찰 가능 항목을 순차적으로, 진행률 표시 줄에 대해 각 방출을 가져옴

  19. 19

    관찰 가능 항목이 완료되는 원인 확인

  20. 20

    Angular 2의 인증, 관찰 가능 항목 처리

  21. 21

    관찰 가능 항목의 조건부 체인

  22. 22

    RxJava는 항목 목록에 대해 관찰 가능한 체인을 만듭니다.

  23. 23

    다른 관찰 가능 항목에서 Rxjs 스트림 전환

  24. 24

    F #에서 두 개의 관찰 가능 항목 결합

  25. 25

    입력 필드에서 관찰 가능 항목 찾기

  26. 26

    RxJava에서 여러 관찰 가능 항목 결합

  27. 27

    canDeactivate에서 두 개의 관찰 가능 항목 처리

  28. 28

    내 주제에 "핫 스왑"관찰 가능 항목

  29. 29

    중첩 된 관찰 가능 항목은 시간 초과 이후에만 오류를 전파합니다.

뜨겁다태그

보관