2016-12-08 16 views
0

rangeFromがrangeToよりも優れていないこと、rangeFromがまだ範囲のリストに存在していないことを検証する次の関数があります。RxJSを使用したデータ検証

これはRxJSを使用してどのように書き換えることができますか?

const isTagAlreadyExist = (tags, currentTag) => _(tags) 
    .filter(x => x.id !== currentTag.id) 
    .some(x => _.inRange(currentTag.rangeTo, x.rangeFrom, x.rangeTo)) 
    .value(); 

const validateRangeFrom = (tags, currentTag) => { 
    const errors = {}; 

    if (isNumeric(currentTag.rangeFrom)) {  
     if (!_.inRange(currentTag.rangeFrom, 0, currentTag.rangeTo)) { 
      errors.rangeFrom = 'FROM_TAG_CANNOT_BE_GREATER_THAN_TO_TAG'; 
     } else if (isTagAlreadyExist(tags, currentTag)) { 
      errors.rangeFrom ='TAG_ALREADY_EXISTS'; 
     } 
    } 

    return { 
     errors 
    }; 
}; 

答えて

1

問題は次のとおりです。どの部分をrxjsに書き換えたいですか?これらは私が見ることができるものから、同期的に実行2つの純粋な機能であり、私は本当にここrxjsのための多くのユースケースが表示されない - もちろん、あなたはいつもrxjsストリーム内のあなたの機能を利用することができる:

const validateRangeFrom$ = (tags, currentTag) => { 
    return Observable.of(currentTag) 
     .map(tag => validateRangeFrom(tags, tag)); 
} 

validateRangeFrom$(myTags, currentTag) 
    .subscribe(errors => console.log(errors)); 

しかし、することができますようにあなたが単純にストリームの中にそれをラップするだけであれば、これはあまり意味がありません。エッセンス有用なリアクティブプログラミングは、いくつかの小さな部分だけでなくすべてが反応的であることです。例えば、tags$currentTag$を観測可能と仮定しましょう。あなたはそれがあると仮定しましょう。

const tags$: Observable<ITag[]>...  // is set somewhere, and emits a new array whenever it is changed 
const currentTag$: Observable<ITag>... // is set somewhere and emits the tag whenever a new currentTag is set 

const validateRangeFrom$ = Observable 
    .combineLatest(tags$, currentTag$, (tags, tag) => ({tags, tag})) 
    .map(({tags, tag}) => validateRangeFrom(tags, tag)); 

validateRangeFrom$.subscribe(errors => console.log(errors)); 

これは、新しいタグ配列が発行されるか、新しいcurrentTagが選択/設定されるたびに自動的に検証をトリガーしますが、再度検証メソッドが同じに保たれます。 (tags$currentTag$を参照)

+0

説明のためにRxJSをまだ学んでいますが、使用方法はまだわかりません。助けてくれてありがとう。 – Anas

関連する問題