Programing

이전 AJAX 통화 요청이 해결될 때까지 RxJs를 사용하여 모든 요청을 보류하는 방법

c10106 2022. 3. 17. 20:51
반응형

이전 AJAX 통화 요청이 해결될 때까지 RxJs를 사용하여 모든 요청을 보류하는 방법

나는 어떤 외부 요소에 의해 촉발된 행동을 나타내는 관찰력이 있다.이 질문의 목적상, 라고 하자.createBananaAction. 나는 a를 가지고 있다.bananaService방법대로createAJAX 요청을 수행하고 생성된 바나나를Promise.

그래서, 어떤 데이터가 도착할때마다createBananaAction, 우리는 전화하기를 원한다.bananaService.create().

코드는 다음과 같다: (RxJs 사용)

this.createdBananas = createBananaAction.flatMap(() => bananaService.create());

이제 기존 바나나를 받은 뒤에야 다른 바나나를 요청할 수 있도록 createBananaAction을 '스스로틀'하는 것이 과제다.간단히 말해서, 두 번의 동시 통화는 절대 있을 수 없다.bananaService.create()나는 제때에 조절하고 싶지 않지만 바나나 서비스가 그것의 일을 하는 동안 새로운 바나나를 위한 모든 들어오는 요청은 무시하기를 원한다는 것에 주목하라.

내가 조사를 좀 해봤더니 겉보기에는 적절해 보이는 교환원을 찾아냈다.

내 코드는 이렇게 생겼어:

const pausableCreateBananaAction = createBananaAction.pausable();

this.createdBananas = pausableCreateBananaAction
    .do(() => pausableCreateBananaAction.pause())
    .flatMap(() => bananaService.create())
    .do(() => pausableCreateBananaAction.resume());

이게 효과가 있는 것 같은데, 이게 필요한 게 마음에 안 들어.do수동으로 트리거할 명령문pause그리고resume진술들

나는 네가 관찰할 수 있는 것을 알아냈다.pausable그럼 생산해야 할 것false또는true적절한 시기에, 그러나 이것은 또한 내가 주제에서 수동으로 값을 푸시해야 한다.이와 비슷한 것:

const letItGoThrough = new Rx.Subject();

this.createdBananas = createBananaAction
    .pausable(letItGoThrough.startWith(true))
    .do(() => letItGoThrough.onNext(false))
    .flatMap(() => bananaService.create())
    .do(() => letItGoThrough.onNext(true));

그래서 지금 나는 Rx를 가지고 있다.제목(대상은 RxJs의 교육용 바퀴와 같으며, RxJs에서 충분히 경험을 쌓을 때까지 사용하는 것으로 더 이상 필요하지 않다.)과 두 번의 통화로 다음 작업을 수행하십시오.do.

내가 원하는 것을 할 수 있는 완전한 "적극적" 방법이 있는가?아니면 내가 내 취향에 너무 절실해 보이고 느끼는 이 구조를 고수하고 있는 것일까.

미리 고맙다.

대신 flatMapFirst를 사용하십시오.flatMap:

this.createdBananas = createBananaAction.flatMapFirst(() => bananaService.create());

위와 같은 가정은 다음과 같다.bananaService.create()감기가 재발하다만약 그것이 관찰할 수 있는 뜨거운 것을 되돌려준다면Promise그럼 통화를 마무리짓고Observable.defer그것을 관찰할 수 있는 차가운 것으로 바꾸다flatMapFirst발사를 적절하게 제어할 수 있다.

this.createdBananas = createBananaAction
    .flatMapFirst(() => Rx.Observable.defer(() => bananaService.create()));

참조URL: https://stackoverflow.com/questions/32783559/how-can-i-use-rxjs-to-hold-off-any-requests-for-an-ajax-call-until-the-previous

반응형