2016-11-03 10 views
1

私は愚か者であり、このようなことはまだどうしたらよいか完全に理解していないかもしれないかもしれないが、私は寛大な観測でアクションをディスパッチし、解決する前に別のアクションを待つという約束をする方法。私はアクションを'__IGNORE__'にマッピングすることでそれを動作させましたが、実際にはしたくありません。叙事詩のアクションを処理する方法はありますか?新たな行動を出さない、寛大な叙事詩

export const waitFor = (type, action) => new Promise((resolve, reject) => { 
    const waitForResult = action$ => action$.ofType(type).do(() => resolve()).mapTo({type: "___IGNORE___"}); 
    registerEpic(waitForResult); 

    action(); 
}); 

答えて

7

あなたは.ignoreElements() RxJS演算子

action$.ofType(type) 
    .do(() => resolve()) 
    .ignoreElements(); 

これを行うための別の方法を使用することにより、観察チェーンから任意のnext'd値を捨てることができます(これ以上右:ここ

は私のコードませんまたは間違っている)は、ただ購読する匿名Observableを作成することです。

const waitForResultEpic = action$ => new Observable(observer => 
    action$.ofType(type) 
    .subscribe(() => resolve()) 
); 

これは私たちが作成したサブスクリプションを暗黙的に返しているため、rootEpicのライフサイクルにも添付されています。我々はobserver.next()を決して呼ぶことはないので、この叙事詩はいかなる値も出さない。ちょうどignoreElements()のように。


あなたは求めていませんでしたが、あなたは最終的にtype変数に一致すること、着信アクションのために聞いて、あなたの叙事詩は永遠に実行されることがあります。 を一度とマッチさせたい場合、これはあなたが望むものではないかもしれません。

これは、.take(1)演算子を使用して実行できます。

const waitForResult = action$ => 
    action$.ofType(type) 
    .take(1) 
    .do(() => resolve()) 
    .ignoreElements(); 

それとも

const waitForResult = action$ => new Observable(observer => 
    action$.ofType(type) 
    .take(1) 
    .subscribe({ 
     next:() => resolve(), 
     error: err => observer.error(err), 
     complete:() => observer.complete() 
    }) 
); 

これが唯一のアプリケーションの人生に一度マッチします - 一度それが再びそれを行うことはありません受け取りました。