2017-01-05 10 views
1

同僚と私はAndroidアプリケーションにフローのようなフローを追加して、最初のコールが完了するまでアクションの受信を停止する叙事詩を作成する方法を理解できません。最初のリクエストが完了するまでアクションを無視するEpic

私はskipUntil()を使うことができたと思っていましたが、skipUntil()の結果が残り、チェーンの残りの部分に渡されることはありませんでした。

以下は、私たちが達成しようとしていることを示す、大雑把なJSコードです。

const fetchUserEpic = action$ => 
    action$.ofType(FETCH_USER) 
    .skipUntil(/* first request completes */) 
    .mergeMap(action => 
     ajax.getJSON(`/api/users/${action.payload}`) 
     .map(response => fetchUserFulfilled(response)) 
     .takeUntil(action$.ofType(FETCH_USER_CANCELLED)) 
    ); 

それは、観察が進行中である場合は、すべての項目を無視して、私は、switchMap()のように動作しますが、一度に一つのリクエストを尊重skipMap()オペレータを必要とするほとんどのようなものです。

ありがとうございます。

答えて

2

として、あなたはそれは(あなたが以前のクエリを実行しながら、それが入力を落とし、通常ではありません結果が時代遅れであることを意味し、switchMapおよび/またはdebounceが通常好ましい)何が必要だ、take(1) + repeatが動作するはずかなり確信していると仮定すると、観察可能な行動は熱いです。

const fetchUserEpic = action$ => 
    action$.ofType(FETCH_USER) 
    .take(1) 
    .concatMap(action => 
     ajax.getJSON(`/api/users/${action.payload}`) 
     .map(response => fetchUserFulfilled(response)) 
     .takeUntil(action$.ofType(FETCH_USER_CANCELLED)) 
    ) 
    .repeat() 

ロジックをシミュレートするスニペットです。

// simulate action$.ofType(FETCH_USER) every second 
 
const obs1 = Rx.Observable.interval(1000).publish() 
 
obs1.connect() 
 

 
function getStuff(i) { 
 
    return Rx.Observable.timer(i*1000).mapTo(i) 
 
} 
 

 
obs1.take(1).concatMap(getStuff).repeat().subscribe(console.log)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.2/Rx.js"></script>

+0

ありがとうございます。私はこれを試してみましょう。私たちが考えているユースケースは、元の返答が返ってくる前にユーザーが送信ボタンをすばやくクリックしたり、データを更新しようとした場合です。 – jachenry

+1

リクエストが機内で行われている間に送信ボタンを無効にすると、より良い/より安全なオプションになります(FETCH_USERで設定された状態、FETCH_FULLFILLED/CANCELEDでリセットされます) – Gluck

1

あなたは空想何もする必要はありません、このため、オペレータがexhaustMapと呼ばれる、すでに存在しています。 exhaustMapは、concatMapに似ていますが、前の処理がまだ処理されている間に入ってきた要求は、静かに削除されます。

const fetchUserEpic = action$ => 
    action$.ofType(FETCH_USER) 
    .exhaustMap(action => 
     ajax.getJSON(`/api/users/${action.payload}`) 
     .map(response => fetchUserFulfilled(response)) 
     .takeUntil(action$.ofType(FETCH_USER_CANCELLED)) 
    ); 
+0

@jachenry exhaustMapは間違いなく最も慣用的です – jayphelps

+0

@jayphelphs rxjavaと同等ですか?ドキュメントには表示されません。 – jachenry

+0

@jachenry相当品がありません。カスタムオペレータが必要です。 – jayphelps

関連する問題